如何轻松求两个hashMap的和<String,Integer>?

问题描述 投票:0回答:3

我有两个

HashMap<String,Integer>

我怎样才能轻松地对它们求和?

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

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

但认为可能有更简单的方法吗?

我更喜欢将整数求和到其中一张地图中。不创建新的

java hashmap hashtable
3个回答
22
投票

我更喜欢将整数求和到其中一张地图中。不创建新的

在这种情况下,您可以使用 Java 8 中添加到 merge

 接口的 
Map
 方法。否则请查看其他答案,例如 https://stackoverflow.com/a/33640413

无论如何

Map#merge(key, value, merginFunction)
方法与
Map#add(key, value)
类似。唯一的区别是它需要第三个参数,即:

  • 用于决定在映射中放入什么值的函数如果它已经包含指定的键。将根据旧值和新值做出决定(因此它的 lambda 可能看起来像
    (v1, v2) -> v1 + v2
    来求和值,或者我们可以使用
    Integer::sum
    方法参考)。

所以你可以简单地使用:

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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.