如何合并多个散列图也可以将java中相同键的值相加

我试图合并多个哈希图也总和相同的键的值,ı想用玩具示例解释我的问题如下

HashMap m = new HashMap(); HashMap m2 = new HashMap(); m.put("apple", 2); m.put("pear", 3); m2.put("apple", 9); m2.put("banana", 6); 

我试过putall

m.putAll(M2);

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

但它的结果并不适用于这个问题。 我希望输出为

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

怎么能在java中得到这个结果?

如果您使用的是Java 8,则可以使用Map的新合并方法。

 m2.forEach((k, v) -> m.merge(k, v, (v1, v2) -> v1 + v2)); 

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

 Map combinedMap = Stream.concat(m1.entrySet().stream(), m2.entrySet().stream()) .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.summingInt(Map.Entry::getValue))); 

这个解决方案有很多好处,包括能够使它平行,扩展到你想要的任意数量的地图,并且能够在需要时轻松过滤地图。 它也不要求原始地图是可变的。

这个方法应该这样做(在Java 5+中)

 public static  Map mergeAndAdd(Map... maps) { Map result = new HashMap<>(); for (Map map : maps) { for (Map.Entry entry : map.entrySet()) { K key = entry.getKey(); Integer current = result.get(key); result.put(key, current == null ? entry.getValue() : entry.getValue() + current); } } return result; } 

这是我快速而又脏的实现:

 import java.util.HashMap; import java.util.Map; public class MapMerger { public static void main(String[] args) { HashMap m = new HashMap<>(); HashMap m2 = new HashMap<>(); m.put("apple", 2); m.put("pear", 3); m2.put("apple", 9); m2.put("banana", 6); final Map result = (new MapMerger()).mergeSumOfMaps(m, m2); System.out.println(result); } public Map mergeSumOfMaps(Map... maps) { final Map resultMap = new HashMap<>(); for (final Map map : maps) { for (final String key : map.keySet()) { final int value; if (resultMap.containsKey(key)) { final int existingValue = resultMap.get(key); value = map.get(key) + existingValue; } else { value = map.get(key); } resultMap.put(key, value); } } return resultMap; } } 

输出:

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

你应该做一些事情(比如空检查),我不确定它是否是最快的。 此外,这是整数特有的。 我试图使用Number类的generics来创建一个,但是你需要为每种类型(byte,int,short,more等)使用此方法

ı改进卢卡斯罗斯的代码。 而不是通过函数输入一个地图ı给所有地图一次与这样的hashmap的arraylist一起工作

  public HashMap mergeAndAdd(ArrayList> maplist) { HashMap result = new HashMap<>(); for (HashMap map : maplist) { for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); Integer current = result.get(key); result.put(key, current == null ? entry.getValue() : entry.getValue() + current); } } return result; } 

}

它也有效。 感谢大家

如果密钥存在,请添加其值。 如果没有插入。

这是一个将一个地图合并为另一个地图的简单示例:

 Foo oldVal = map.get(key); if oldVal == null { map2.put(key, newVal); } else { map2.put(key, newVal + oldVal); } 

显然你必须遍历第一张地图,这样你就可以处理它的所有条目,但这很简单。

像这样的东西应该工作:

  for (Map.Entry entry : map.entrySet()) { String map1_key = entry.getKey(); int map1_value = entry.getValue(); //check: if(map2.get(map1_key)!=null){ int map2_value = map2.get(map1_key); //merge: map3.put(map1_key,map1_value+map2_value); }else{ map3.put(map1_key,map1_value); } } for (Map.Entry entry2 : map2.entrySet()) { String map2_key = entry2.getKey(); int map2_value = entry2.getValue(); //check: if(map1.get(map2_key)!=null){ int map1_value = map1.get(map2_key); //merge: map3.put(map2_key,map1_value+map2_value); }else{ map3.put(map2_key,map2_value); } }