如何轻松地将两个hashMap <String,Integer>相加?

Ela*_*da2 4 java hashtable hashmap

我有两个 HashMap<String,Integer>

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

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

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

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

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

Psh*_*emo 15

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

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

所以你可以简单地使用:

map2.forEach((k, v) -> map1.merge(k, v, Integer::sum));
Run Code Online (Sandbox Code Playgroud)

现在,您map1将包含所有值,map2并且在相同键的情况下,旧值将添加到新值,结果将存储在地图中.

DEMO:

Map<String, Integer> m1 = new HashMap<>();
m1.put("a", 1);
m1.put("b", 2);
Map<String, Integer> 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);
Run Code Online (Sandbox Code Playgroud)

输出:

{a=1, b=2}
{a=3, c=10}
===========
{a=4, b=2, c=10}
Run Code Online (Sandbox Code Playgroud)


zap*_*apl 6

如果您喜欢 Java 8:

Map<String, Integer> sum(Map<String, Integer>... maps) {
    return Stream.of(maps)    // Stream<Map<..>>
            .map(Map::entrySet)  // Stream<Set<Map.Entry<..>>
            .flatMap(Collection::stream) // Stream<Map.Entry<..>>
            .collect(Collectors.toMap(Map.Entry::getKey,
                                      Map.Entry::getValue,
                                      Integer::sum));
}
Run Code Online (Sandbox Code Playgroud)

可以总结任意数量的地图。它Stream<Map.Entry<String, Integer>在前几行将映射数组转换为 a ,然后将所有条目收集到一个新条目中,Map同时在出现重复值的情况下提供“合并函数”。

或者类似的东西

void addToA(HashMap<String, Integer> a, HashMap<String, Integer> b) {
    for (Entry<String, Integer> entry : b.entrySet()) {
        Integer old = a.get(entry.getKey());
        Integer val = entry.getValue();
        a.put(entry.getKey(), old != null ? old + val : val);
    }
}
Run Code Online (Sandbox Code Playgroud)