2015-06-18 56 views
0

是否有人知道是否有一個地圖結構或庫,當組合兩個地圖時,可輕鬆支持添加地圖的值。覆蓋java地圖,添加所有鍵

HashMap<String, Integer> score1 = new HashMap<>(); 
HashMap<String, Integer> addition = new HashMap<>(); 

score1.put("Chicaco", 2); 
score1.put("New york", 1); 

addition.put("New york", 1); 
addition.put("Los Angeles", 1); 

是否有某種方式來score1與另外結合起來,這樣的結果是
「芝加哥」 的地圖 - > 2,
「紐約」 - > 2,
「洛杉磯」 - > 1?

我知道我可以在Map上迭代使用流和新的(Java 8)compute(),但是有沒有其他不需要手動迭代的方法?

我想一定是有比處理自己的迭代,如更好的辦法:

addition.forEach((k1, v1) -> score1.compute(k1, (k2, v2) -> v2==null?v1:v1+v2)); 
score1.forEach((k,v)-> System.out.println(k+":"+v)); 
+0

Sashi最接近,但幾乎每個人都failes看到,紐約必須更新值的紐約在每個地圖的總和。即 - > 2 – Billybong

回答

1

如果你正在尋找的

addition.forEach((k1, v1) -> score1.compute(k1, (k2, v2) -> v2==null?v1:v1+v2)); 

替代然後

addition.forEach((k, v) -> score1.merge(k, v, (v1, v2) -> v1 + v2)); 

好像改善。

所以,你的代碼也可以看起來像:

Map<String, Integer> result = new HashMap<>(); 
score1.forEach((k, v) -> result.merge(k, v, (v1, v2) -> v1 + v2)); 
addition.forEach((k, v) -> result.merge(k, v, (v1, v2) -> v1 + v2)); 

您也可以使用流,就像把它改寫:

Map<String, Integer> map2 = Stream.concat(
     score1.entrySet().stream(), 
     addition.entrySet().stream() 
).collect(Collectors.toMap(
     Entry::getKey, 
     Entry::getValue, 
     (v1, v2) -> v1+ v1) 
); 

,但我覺得forEach液清潔。

+0

Merge似乎是最好的方法。接受答案。 – Billybong

-1

你可以嘗試以下....

score1.putAll(addition); 

這將增加所有除了score1的值。

+0

不,它不會增加現有項目的價值。所以結果是:「Chicago」 - > 2, 「New York」 - > 1, 「Los Angeles」 - > 1 – Nailgun

-1

是的,你可以使用番石榴Multiset

Multiset<String> score1 = HashMultiset.create(); 
Multiset<String> addition = HashMultiset.create(); 

score1.add("Chicaco", 2); 
score1.add("New york", 1); 

addition.add("New york", 1); 
addition.add("Los Angeles", 1); 

那麼你可以將它們組合起來:

Multiset<String> sum = Multisets.sum(score1, addition); 
1

分組Entry<String, Integer>流:

Map<String, Integer> r = Stream.of(score1, addition) 
     .flatMap(map -> map.entrySet().stream()) 
     .collect(Collectors.groupingBy(e -> e.getKey(), 
      Collectors.summingInt(e -> e.getValue()))); 
+0

這個解決方案刪除洛杉磯 – Billybong

+1

@Billybong不,結果是'{Chicaco = 2,New York = 2,Los Angeles = 1}'。 – saka1029

+0

你說得對,我的不好。用了一個糟糕的測試。 – Billybong