如何将具有相同键但不同值的多个Map合并为一个Map

red*_*ite 4 java list hashmap

我有这样的n 地图:

HashMap<String,Double> map1;
HashMap<String,Double> map2; ...
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能将所有这些地图合并为一张地图

我想在不丢失数据的情况下实现这一目标。

例子:

map1 has entries: {<X1, Y1>, <X2,Y2>, <X3,Y3>} 
Run Code Online (Sandbox Code Playgroud)
map2 has entries: {<X1, Y6>, <X2, Y7>, <X3,Y8>}
Run Code Online (Sandbox Code Playgroud)
mergedMap: {<X1, Y1+Y6>, <X2,Y2+Y7>, <X3, Y3+Y8>}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个:

ArrayList<HashMap<String, Double>> listHashMap = new ArrayList<>();
            
HashMap<String,Double> mergedMap = new HashMap<>();
for(HashMap<String,Double> map: listHashMap) {  
    mergedMap.putAll(map);          
}
Run Code Online (Sandbox Code Playgroud)

但我知道映射到同一键的值将被替换(put),而不是添加。

我该怎么做才能将映射到同一键的每个值相加?

Ale*_*nko 5

您可以利用 Java 8 方法merge()来组合每个条目的数据:

List<Map<String, Double>> list = // initializing source list
Map<String, Double> mergedMap = new HashMap<>();

list.forEach(map -> map.forEach((k, v) -> mergedMap.merge(k, v, Double::sum)));
Run Code Online (Sandbox Code Playgroud)

查看代码在 Ideone.com 上实时运行

groupingBy()或者您可以结合使用 Stream API和内置收集器summingDouble()

Map<String, Double> mergedMap = list.stream()
            .flatMap(map -> map.entrySet().stream())
            .collect(Collectors.groupingBy(
                Map.Entry::getKey, Collectors.summingDouble(Map.Entry::getValue)
            ));
Run Code Online (Sandbox Code Playgroud)

查看 Oracle 提供的这些教程,了解有关 lambda 表达式 的更多信息。