如何轻松地对两个hashMap<String,Integer>进行求和?

6

我有两个 HashMap<String,Integer>

如何轻松地将它们求和?

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

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

但是我认为可能会有更简单的方法?

我更喜欢将整数相加到其中一个map中。而不是创建一个新的map


你想创建一个新的地图,将前两个地图合并在一起,还是想通过将第二个地图添加到第一个地图中来更新第一个地图? - Pshemo
我觉得提供一个预期结果结构的示例会很有用。 - emerssso
5
请展示一些代码。直觉上,我会这么说:获取两个keySet,将它们合并成一个Set,在每个映射中查找每个值,将它们相加并添加到一个新的映射中。 - Turing85
@Pshemo 我更喜欢将整数求和到其中一个映射中,而不是创建一个新的。 - Elad Benda2
你必须构建一个新的 HashMap 吗?你可以创建一个对象,该对象引用两个 HashMap 并充当哈希映射表,通过查询两者来实现。有点像集合上的视图。 - Willem Van Onsem
3个回答

21
自Java 8以后,Map 包含merge 方法,该方法需要:

  • 键、
  • 新值,
  • 以及用于决定在地图中放置什么值的函数如果它已经包含了我们的键(决策将基于旧值和新值进行)。

因此,您可以简单地使用:

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

现在,您的map1将包含来自map2的所有值,并且在出现相同键的情况下,旧值将会被加到新值上,并将结果存储在映射中。

演示:

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);

输出:

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

7

如果您喜欢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));
}

可以总结任意数量的映射。在前几行中,它将映射数组转换为Stream<Map.Entry<String, Integer>,然后在出现重复值的情况下提供“合并函数”将所有条目收集到新的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);
    }
}

1

很遗憾,没有简单的方法,您需要手动迭代它们。

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<String, Integer> map1 = new HashMap<String, Integer>();
        map1.put("a", 1);
        map1.put("b", 2);
        map1.put("c", 3);

        Map<String, Integer> map2 = new HashMap<String, Integer>();
        map2.put("a", 4);
        map2.put("b", 5);
        map2.put("d", 6);

        Set<String> keySet = new HashSet<String>();
        keySet.addAll(map1.keySet());
        keySet.addAll(map2.keySet());

        Map<String, Integer> map3 = new HashMap<String, Integer>();
        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());
    }
}

谢谢!它帮助了我。 - MinionAttack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接