我正在尝试合并多个哈希图,也可以将相同密钥的值相加, 我想用玩具示例解释我的问题如下
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);
ı尝试过putall
m.putAll(M2);
输出如下 {banana = 6,apple = 9,pear = 3}
但其结果不适用于此问题。 我想输出
{banana = 6,apple = 11,pear = 3}
怎么能在java中得到这个结果?
答案 0 :(得分:22)
如果您使用的是Java 8,则可以使用Map的新merge方法。
m2.forEach((k, v) -> m.merge(k, v, (v1, v2) -> v1 + v2));
答案 1 :(得分:8)
这是Java 8流的一个非常好的用例。您可以连接条目流,然后在新地图中收集它们:
Map<String, Integer> combinedMap = Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.summingInt(Map.Entry::getValue)));
这个解决方案有很多好处,包括能够使它平行,扩展到你想要的任意数量的地图,并且能够在需要时轻松过滤地图。它也不要求原始地图是可变的。
答案 2 :(得分:1)
这个方法应该这样做(在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;
}
答案 3 :(得分:1)
这是我的快速而肮脏的实施:
import java.util.HashMap;
import java.util.Map;
public class MapMerger {
public static void main(String[] args) {
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);
final Map<String, Integer> result = (new MapMerger()).mergeSumOfMaps(m, m2);
System.out.println(result);
}
public Map<String, Integer> mergeSumOfMaps(Map<String, Integer>... maps) {
final Map<String, Integer> resultMap = new HashMap<>();
for (final Map<String, Integer> 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
类的泛型来创建一个,但是你需要为每种类型(byte,int,short,more等)使用此方法
答案 4 :(得分:1)
ı改善卢卡斯罗斯的代码。而不是在函数中输入一个映射ı给所有映射一次以与hashmap的arraylist一起工作
public HashMap<String, Integer> mergeAndAdd(ArrayList<HashMap<String, Integer>> maplist) {
HashMap<String, Integer> result = new HashMap<>();
for (HashMap<String, Integer> map : maplist) {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer current = result.get(key);
result.put(key, current == null ? entry.getValue() : entry.getValue() + current);
}
}
return result;
}
}
它也有效。感谢大家
答案 5 :(得分:0)
这样的事情应该有效:
for (Map.Entry<String, Integer> 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<String, Integer> 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);
}
}
答案 6 :(得分:0)
如果密钥存在,请添加其值。如果没有插入。
这是一个将一个地图合并为另一个地图的简单示例:
Foo oldVal = map.get(key);
if oldVal == null
{
map2.put(key, newVal);
}
else
{
map2.put(key, newVal + oldVal);
}
显然,你必须遍历第一张地图,这样你就可以处理所有条目,但这很简单。
答案 7 :(得分:0)
假设您有很多HashMap:HashMap<String,Integer> map1, map2, map3;
然后您可以使用Java 8流:
List<Map<String,Integer>> mapList = Arrays.asList(map1, map2, map3);
Map<String,Integer> combinedMap = mapList.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.groupingBy(Entry::getKey,
Collectors.summingInt(Entry::getValue)));