如何轻松地将两个hashMap 相加?

我有两个HashMap

我怎样才能轻松总结它们?

意味着对于字符串“a”,键将是(Map1的值+ Map2的值)的总和?

我可以迭代Map2的每个项目并手动添加到Map1。

但是想到可能有一种更简单的方法?

我更喜欢将整数汇总到其中一张地图中。 没有创建一个新的

由于Java 8 Map包含需要的merge方法

  • 键,
  • 新价值,
  • 和函数, 如果它已经包含我们的密钥 ,将用于决定放在map中的值(将根据旧值和新值做出决定)。

所以你可以简单地使用:

 map2.forEach((k, v) -> map1.merge(k, v, Integer::sum)); 

现在你的map1将包含map2中的所有值,如果是相同的键,旧值将被添加到新值,结果将存储在map中。

DEMO:

 Map m1 = new HashMap<>(); m1.put("a", 1); m1.put("b", 2); Map m2 = new HashMap<>(); m2.put("a", 3); m2.put("c", 10); System.out.println(m1); System.out.println(m2); //iterate over second map and merge its elements into map 1 using //same key and sum of values m2.forEach((k, v) -> m1.merge(k, v, Integer::sum)); System.out.println("==========="); System.out.println(m1); 

输出:

 {a=1, b=2} {a=3, c=10} =========== {a=4, b=2, c=10} 

不幸的是,没有简单的方法。 您需要手动迭代它们。

 import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class HashMapSum { public static void main(String[] args) { Map map1 = new HashMap(); map1.put("a", 1); map1.put("b", 2); map1.put("c", 3); Map map2 = new HashMap(); map2.put("a", 4); map2.put("b", 5); map2.put("d", 6); Set keySet = new HashSet(); keySet.addAll(map1.keySet()); keySet.addAll(map2.keySet()); Map map3 = new HashMap(); Integer val1, val2; for (String key : keySet) { val1 = map1.get(key); val1 = (val1 == null ? 0 : val1); val2 = map2.get(key); val2 = (val2 == null ? 0 : val2); map3.put(key, val1 + val2); } System.out.println(map3.toString()); } } 

如果您喜欢Java 8:

 Map sum(Map... maps) { return Stream.of(maps) // Stream> .map(Map::entrySet) // Stream> .flatMap(Collection::stream) // Stream> .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Integer::sum)); } 

可以总结任意数量的地图。 它将地图数组转换为前几行中的Stream ,然后将所有条目收集到新Map同时在重复值的情况下提供“合并function”。

或者某些东西

 void addToA(HashMap a, HashMap b) { for (Entry entry : b.entrySet()) { Integer old = a.get(entry.getKey()); Integer val = entry.getValue(); a.put(entry.getKey(), old != null ? old + val : val); } }