2 回答

TA貢獻1802條經(jīng)驗 獲得超5個贊
您的方向是正確的,但您需要考慮第一次找到郵政編碼/產(chǎn)品組合時會發(fā)生什么。
在 Java 的更高版本中,有很多Map方法可以使這變得更容易。我將在這里使用它們,但如果您必須使用早期版本,那么您將需要擴展其中一些語句。
像下面這樣:
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);
}
}
獲得計數(shù)最高的產(chǎn)品應(yīng)該相對簡單:
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);
}));
希望這是有道理的——如果沒有的話就問。

TA貢獻1804條經(jīng)驗 獲得超7個贊
我認(rèn)為您希望將 if 語句移至 for 循環(huán)的開頭,并且僅tmpMap在該郵政編碼尚不存在時才創(chuàng)建。如果它已經(jīng)存在,只需使用現(xiàn)有的并使用產(chǎn)品和數(shù)量更新它。
for (Customer customer : this.customers) {
String tmp = customer.getZipCode();
Map<Product, Integer> tmpMap;
if (!zipCodeProducts.containsKey(tmp)){
tmpMap = new HashMap<Product, Integer>();
} else {
tmpMap = zipCodeProducts.get(tmp);
}
for (Purchase purchase: customer.getItems()) {
if (!tmpMap.containsKey(purchase.getProduct())) {
tmpMap.put(purchase.getProduct(),purchase.getAmount());
} else {
tmpMap.put(purchase.getProduct(), tmpMap.get(purchase.getProduct()) + purchase.getAmount());
}
}
zipCodeProducts.put(tmp, tmpMap);
}
添加回答
舉報