如何合并多个hashmaps也可以将java中相同键的值相加

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)


spr*_*ter 8

这是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)

这个解决方案有很多好处,包括能够使它平行,扩展到你想要的任意数量的地图,并且能够在需要时轻松过滤地图.它也不要求原始地图是可变的.


Pet*_*tro 0

像这样的东西应该有效:

 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)