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

标签 java list hashmap

我有n map 这种类型:

HashMap<String,Double> map1;
HashMap<String,Double> map2; ...

我该怎么做才能将所有这些 map 合并成一个单个 map

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

示例:

map1 has entries: {<X1, Y1>, <X2,Y2>, <X3,Y3>} 
map2 has entries: {<X1, Y6>, <X2, Y7>, <X3,Y8>}
mergedMap: {<X1, Y1+Y6>, <X2,Y2+Y7>, <X3, Y3+Y8>}

我试过这个:

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

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

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

最佳答案

您可以利用 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)));

看到code run live at Ideone.com .

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

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

查看 Oracle 提供的这些教程以获取有关的更多信息lambda expressions streams .

关于java - 如何将具有相同键但不同值的多个 map 合并为一个 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72220565/

相关文章:

java - 如何编写不等于某物的匹配器

java - 找不到参数的方法 lombok()

java - Java中检查字符串是否有小数部分 : Locale involved

c# - 奇怪,IEnumerable.ToList() 创建了全新的对象

python - 为什么会出现 "List index out of range"错误?

java - 如何在第一次请求时检测浏览器功能,如 History API、localStorage 等?

c - 删除链接结构的值

Java 泛型 - 混合对象映射

java - entrySet() 如何在 HashMap 内部工作?

java - 将重复值放入 hashmap