使用HashMap更新产品购买次数

时间:2018-04-09 06:54:40

标签: java hashmap containskey

我正在阅读一个.txt文件,它需要能够在产品图中使用产品密钥5020更新条目,将购买次数增加2.到目前为止,我能够通过客户地图,但我也需要通过产品地图再次展示。

每当我尝试以与客户地图相同的方式执行此操作时,我不会获取文件中的所有条目。我必须使用HashMap,我不熟悉它。

我认为问题在于产品图的if语句。

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])));
        }

      }

    }
  }
}

这是文件:

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

1 个答案:

答案 0 :(得分:0)

首先,有点不清楚你在问什么,而且代码很难阅读。所以我建议你这样开始简化你的代码,它更容易阅读并简化调试:

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
  }
}

这两条线似乎什么都不做(如果它们是正确的吸气剂)

c.getSingleItemPrice();

c.getItemsPurchased();

我无法看到你所说的增加2的位置。

您还可以定义用于构建客户的文件中的7个值,并提供可能导致问题的Sales.txt文件示例。

我认为问题是:

怀疑是您为同一个客户提供了多种产品。

您的customers地图的关键字为customerId,价值为Customer,因此假设您拥有唯一的ID,则每个客户都会有一个条目。

products地图中,您有customerId为关键字,Product为值。 如果客户有多个产品,那么您试图将客户的所有产品放在同一个密钥上,并且它们互相替换,因此您将拥有更少的条目。 您可能希望productsMap<Integer, List<Customer>>,因此您有每个ProductId的客户列表

可能的解决方案:

以下是相同的代码,但对于productsMap使用Map<Integer, List<Customer>>

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);
}

我使用了您提供的文件,它会生成以下地图

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]
}