我正在尝试合并多个哈希图,并将同一个键的值相加,ı想用下面的例子来解释我的问题
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中,ı如何获得这样的结果?
发布于 2015-03-05 07:02:27
如果您使用的是Java8,则可以使用Map的新merge方法。
m2.forEach((k, v) -> m.merge(k, v, (v1, v2) -> v1 + v2));发布于 2015-03-05 07:05:28
这是Java 8 streams的一个非常好的用例。您可以将条目流连接在一起,然后在新的映射中收集它们:
Map<String, Integer> combinedMap = Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.summingInt(Map.Entry::getValue)));这个解决方案有很多优点,包括能够使其并行,扩展到您想要的任意多个地图,并且能够在需要时对地图进行简单的过滤。它也不要求原始映射是可变的。
发布于 2015-03-05 06:59:35
这个方法应该能做到这一点(在Java 5+中)
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;
}https://stackoverflow.com/questions/28866085
复制相似问题