Mel*_*tkn 14 java merge hashmap
我试图合并多个哈希图也总和相同键的值,ı想用玩具示例解释我的问题如下
HashMap<String, Integer> m = new HashMap<>();
HashMap<String, Integer> m2 = new HashMap<>();
m.put("apple", 2);
m.put("pear", 3);
m2.put("apple", 9);
m2.put("banana", 6);
Run Code Online (Sandbox Code Playgroud)
我试过putall
m.putAll(M2);
输出如下{banana = 6,apple = 9,pear = 3}
但它的结果不适用于这个问题.我希望输出为
{banana = 6,apple = 11,pear = 3}
怎么能在java中得到这个结果?
pru*_*nge 25
如果您使用的是Java 8,则可以使用Map 的新合并方法.
m2.forEach((k, v) -> m.merge(k, v, (v1, v2) -> v1 + v2));
Run Code Online (Sandbox Code Playgroud)
这是Java 8流的一个非常好的用例.您可以连接条目流,然后在新地图中收集它们:
Map<String, Integer> combinedMap = Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.summingInt(Map.Entry::getValue)));
Run Code Online (Sandbox Code Playgroud)
这个解决方案有很多好处,包括能够使它平行,扩展到你想要的任意数量的地图,并且能够在需要时轻松过滤地图.它也不要求原始地图是可变的.
像这样的东西应该有效:
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String map1_key = entry.getKey();
int map1_value = entry.getValue();
//check:
if(map2.get(map1_key)!=null){
int map2_value = map2.get(map1_key);
//merge:
map3.put(map1_key,map1_value+map2_value);
}else{
map3.put(map1_key,map1_value);
}
}
for (Map.Entry<String, Integer> entry2 : map2.entrySet()) {
String map2_key = entry2.getKey();
int map2_value = entry2.getValue();
//check:
if(map1.get(map2_key)!=null){
int map1_value = map1.get(map2_key);
//merge:
map3.put(map2_key,map1_value+map2_value);
}else{
map3.put(map2_key,map2_value);
}
}
Run Code Online (Sandbox Code Playgroud)