javahashmapcontainskey

Update the count of the purchases of products using HashMap


I am reading a .txt file and it needs to be able to update the entry with the products key 5020 in product map, increasing the count of purchases by 2. So far I am able to do it by the costumer map, but I need to make another display by the product map too.

Whenever I try to do it the same way as my customers map i don't get all the entries in my file. I have to use HashMap and I am unfamiliar with it.

I think the problem lies in the if statement for the products map.

public class StoreSales {
  public static void main(String[] args) {
    List<Customer> customer = new ArrayList<>();
    try {
      readFile("Sales.txt", customer);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    System.out.println(customer);
  }

  public static void readFile(String file, List<Customer> cust) throws IOException, ClassNotFoundException {
    Map<Integer, Customer> customers = new HashMap<>();
    Map<Integer, Customer> product = new HashMap<>();
    try (BufferedReader in = new BufferedReader(new FileReader(file))) {
      String line;
      while ((line = in.readLine()) != null) {
        String[] arr = line.split(" ");
        cust.add(new Customer(Integer.parseInt(arr[0]), arr[1], arr[2],
            Integer.parseInt(arr[3]), arr[4], Double.parseDouble(arr[5]),
            Integer.parseInt(arr[6])));

        if (customers.containsKey(Integer.parseInt(arr[0]))) {
          Customer c = customers.get(Integer.parseInt(arr[0]));
          customers.get(Integer.parseInt(arr[0])).getSingleItemPrice();
          c.addTotal(Double.parseDouble(arr[5]) * Integer.parseInt(arr[6]));
          customers.put(Integer.parseInt(arr[0]), c);
        } else {
          customers.put(Integer.parseInt(arr[0]),
              new Customer(Integer.parseInt(arr[0]), arr[1], arr[2],
                  Integer.parseInt(arr[3]), arr[4], Double.parseDouble(arr[5]),
                  Integer.parseInt(arr[6])));
        }

        if (product.containsKey(Integer.parseInt(arr[3]))) {
          Customer p = product.get(Integer.parseInt(arr[3]));
          customers.get(Integer.parseInt(arr[3])).getItemsPurchased();
          p.addTotal(Double.parseDouble(arr[5]) * Integer.parseInt(arr[6]));
          product.put(Integer.parseInt(arr[3]), p);
        } else {
          product.put(Integer.parseInt(arr[3]),
              new Customer(Integer.parseInt(arr[0]), arr[1], arr[2],
                  Integer.parseInt(arr[3]), arr[4], Double.parseDouble(arr[5]),
                  Integer.parseInt(arr[6])));
        }

      }

    }
  }
}

this is the file:

1001 Martha Washington 5001 dress 120 1
1002 John Adams 5002 shirt 55 3
1002 John Adams 5003 tie 20 2
1003 George Washington 5003 tie 20 1
1004 Benjamin Franklin 5010 hat 60 1
1005 Abigail Adams 5020 blouse 45 2
1005 Abigail Adams 5013 skirt 80 1
1004 Benjamin Franklin 5015 coat 500 1
1004 Benjamin Franklin 5012 umbrella 15 1
1006 Deborah Read 5001 dress 120 2
1007 Robert Livingston 5003 tie 20 1
1002 John Adams 5010 hat 60 1
1001 Martha Washington 5014 gloves 20 1
1005 Abigail Adams 5014 gloves 20 2
1006 Deborah Read 5012 umbrella 15 4
1006 Deborah Read 5013 skirt 80 1
1004 Benjamin Franklin 5003 tie 20 5
1006 Deborah Read 5007 jacket 70 1
1001 Martha Washington 5013 skirt 80 1
1003 George Washington 5015 coat 500 1
1007 Robert Livingston 5008 pants 75 1

Solution

  • First of all, it is a bit unclear what you are asking, and the code is difficult to read. So I suggest you simplify your code this way to start with, it is easier to read and will simplify the debugging:

    public static void readFile(String file, List<Customer> cust) {
      Map<Integer, Customer> customers = new HashMap<>();
      Map<Integer, Customer> products = new HashMap<>();
    
      try (BufferedReader in = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = in.readLine()) != null) {
          String[] arr = line.split(" ");
    
          int v0 = Integer.parseInt(arr[0]);
          String v1 = arr[1];
          String v2 = arr[2];
          int v3 = Integer.parseInt(arr[3]);
          String v4 = arr[4];
          double v5 = Double.parseDouble(arr[5]);
          int v6 = Integer.parseInt(arr[6]);
    
          Customer customer = new Customer(v0, v1, v2, v3, v4, v5, v6);
    
          cust.add(customer);
    
          if (customers.containsKey(v0)) {
            Customer c = customers.get(v0);
            c.getSingleItemPrice();
            c.addTotal(v5 * v6);
            customers.put(v0, c);
          } else {
            customers.put(v0, customer);
          }
    
          if (products.containsKey(v3)) {
            Customer c = products.get(v3);
            c.getItemsPurchased();
            c.addTotal(v5 * v6);
            products.put(v3, c);
          } else {
            products.put(v3, customer);
          }
        }
      } catch(Exception e) {
        // Handle Exception
      }
    }
    

    Also these 2 lines seem to be doing nothing (if they are proper getters)

    c.getSingleItemPrice();
    

    and

    c.getItemsPurchased();
    

    I can't see where you do your incrementation by 2 that you are talking about.

    Also can you define what are the 7 values from the file that you use to construct your customer and give an example of the Sales.txt file which would create the problem.

    What I think the issue is:

    The suspicion is that you have several products for the same customer.

    Your customers map has the customerId as key and the Customer as value, so assuming you have unique ids, you will have one entry per customer.

    In your products Map you have customerId as key and the Product as value. If a customer has several products, then you are trying to put all the products of a customer at the same key, and they replace each other, so you will have less entries. You probably want products to be Map<Integer, List<Customer>> so you have a list of Customer for each ProductId

    A possible solution:

    Here is the same code but using a Map<Integer, List<Customer>> for the productsMap

    public static void readFile(String file, List<Customer> customersList) {
        Map<Integer, Customer> customersByIdMap = new HashMap<>();
        Map<Integer, List<Customer>> customersByProductIdMap = new HashMap<>();
    
        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = in.readLine()) != null) {
                String[] arr = line.split(" ");
    
                // Create the Customer
                int customerId = Integer.parseInt(arr[0]);
                String firstName = arr[1];
                String lastName = arr[2];
                int productId = Integer.parseInt(arr[3]);
                String productDescription = arr[4];
                double singleItemPrice = Double.parseDouble(arr[5]);
                int itemsPurchased = Integer.parseInt(arr[6]);
                Customer customer = new Customer(customerId, firstName, lastName, productId, productDescription, singleItemPrice, itemsPurchased);
    
                // Add it to the Customer List
                customersList.add(customer);
    
                // Add it to the customersByIdMap Map
                if (customersByIdMap.containsKey(customerId)) {
                    Customer c = customersByIdMap.get(customerId);
                    c.addTotal(singleItemPrice * itemsPurchased);
                    customersByIdMap.put(customerId, c);
                } else {
                    customersByIdMap.put(customerId, customer);
                }
    
                // Add it to the customersByProductIdMap Map
                if (customersByProductIdMap.containsKey(productId)) {
                    // get the customers list for this product
                    List<Customer> productCustomers = customersByProductIdMap.get(productId);
                    // check if there is already a customer with this Id
                    Customer currentCustomer = null;
                    for(Customer c : productCustomers) {
                        if(c.getId() == customerId) {
                            currentCustomer = c;
                        }
                    }
                    // if yes, update it
                    if(currentCustomer!=null) {
                        currentCustomer.addTotal(singleItemPrice * itemsPurchased);
                    } else {
                        // if no, add it
                        productCustomers.add(customer);
                        customersByProductIdMap.put(productId, productCustomers);
                    }
                } else {
                    List<Customer> productCustomers = new ArrayList<>();
                    productCustomers.add(customer);
                    customersByProductIdMap.put(productId, productCustomers);
                }
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    
        System.out.println("customersByIdMap: ");
        System.out.println(customersByIdMap);
        System.out.println("customersByProductIdMap: ");
        System.out.println(customersByProductIdMap);
    }
    

    I used a file you provided, it generates the following maps

    customersByIdMap:
    {
        1001=Customer@60e53b93, 
        1002=Customer@5e2de80c, 
        1003=Customer@1d44bcfa, 
        1004=Customer@266474c2, 
        1005=Customer@6f94fa3e, 
        1006=Customer@5e481248, 
        1007=Customer@66d3c617
    }
    customersByProductIdMap:
    {
        5008=[Customer@63947c6b], 
        5010=[Customer@266474c2, Customer@2b193f2d], 
        5012=[Customer@355da254, Customer@4dc63996], 
        5013=[Customer@d716361, Customer@6ff3c5b5, Customer@3764951d], 
        5014=[Customer@4b1210ee, Customer@4d7e1886], 
        5015=[Customer@3cd1a2f1, Customer@2f0e140b], 
        5001=[Customer@60e53b93, Customer@5e481248], 
        5002=[Customer@5e2de80c], 
        5003=[Customer@7440e464, Customer@1d44bcfa, Customer@66d3c617, Customer@49476842], 
        5020=[Customer@6f94fa3e], 
        5007=[Customer@78308db1]
    }