首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中合并多个hashmap并对同一键的值求和?

如何在java中合并多个hashmap并对同一键的值求和?
EN

Stack Overflow用户
提问于 2015-03-05 06:13:07
回答 8查看 13.5K关注 0票数 16

我正在尝试合并多个哈希图,并将同一个键的值相加,ı想用下面的例子来解释我的问题

代码语言:javascript
复制
    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);

ı尝试推送

m.putAll(m2);

输出如下{banana=6,apple=9,pear=3}

但是它的结果对于这个问题是不正确的。ı希望输出为

{banana=6,apple=11,pear=3}

在java中,ı如何获得这样的结果?

EN

回答 8

Stack Overflow用户

发布于 2015-03-05 07:02:27

如果您使用的是Java8,则可以使用Map的新merge方法。

代码语言:javascript
复制
m2.forEach((k, v) -> m.merge(k, v, (v1, v2) -> v1 + v2));
票数 33
EN

Stack Overflow用户

发布于 2015-03-05 07:05:28

这是Java 8 streams的一个非常好的用例。您可以将条目流连接在一起,然后在新的映射中收集它们:

代码语言:javascript
复制
Map<String, Integer> combinedMap = Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
    .collect(Collectors.groupingBy(Map.Entry::getKey,
             Collectors.summingInt(Map.Entry::getValue)));

这个解决方案有很多优点,包括能够使其并行,扩展到您想要的任意多个地图,并且能够在需要时对地图进行简单的过滤。它也不要求原始映射是可变的。

票数 11
EN

Stack Overflow用户

发布于 2015-03-05 06:59:35

这个方法应该能做到这一点(在Java 5+中)

代码语言:javascript
复制
public static <K> Map<K, Integer> mergeAndAdd(Map<K, Integer>... maps) {
    Map<K, Integer> result = new HashMap<>();
    for (Map<K, Integer> map : maps) {
        for (Map.Entry<K, Integer> entry : map.entrySet()) {
            K key = entry.getKey();
            Integer current = result.get(key);
            result.put(key, current == null ? entry.getValue() : entry.getValue() + current);
        }
    }
    return result;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28866085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档