Вы на правильном пути, но вам нужно продумать, что происходит, когда вы впервые обнаружите комбинацию почтового индекса / продукта.
Существует довольно много Map
способов, которые упростят эту задачу позже. версии Java. Я буду использовать их здесь, но если вам придется использовать более раннюю версию, вам нужно будет расширить некоторые из этих утверждений.
Что-то вроде следующего:
Map<String, Map<Product, Integer>> zipCodeProducts = new HashMap<>();
for (Customer customer: customers) {
Map<Product,Integer> productCounts = zipCodeProducts.computeIfAbsent(customer.getZipCode(), () -> new HashMap<>());
for (Purchase purchase: customer.getItems()) {
productCounts.merge(purchase.getProduct(), 1, Integer::sum);
}
}
Получение продуктас наибольшим количеством должно быть относительно просто:
Map<String,Integer> maxProducts = new HashMap<>();
zipCodeProducts.forEach((zc, pc) -> pc.forEach((pr, n) -> {
if (!maxProducts.contains(zc) || n > pc.get(maxProducts.get(zc)))
maxProducts.put(zc, pr);
}));
Надеюсь, что имеет смысл - спросите, если нет.