我有n个这样的maps个:

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

我该怎么做才能把这maps个合并成single map个呢?

我希望在不丢失数据的情况下实现这一点.

Example:

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了吗.

或者,您可以将流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)
            ));

Take a look at these tutorials provided by Oracle for more information on lambda expressions and streams.

Java相关问答推荐

Selenium Java:无法访问IFRAME内部的元素

RDX触发ChoiceBox转换器(并按字符串值排序)

日食IDE 2024-03在Ubuntu下崩溃,导致hr_err_pid.log

Java JAR环境(JRE)是否支持模块?

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

AssertJ Java:多条件断言

第三方Jar pom.xml

如何让JVM在SIGSEGV崩溃后快速退出?

搜索列表返回多个频道

声明带有泛型的函数以用作查找映射中的值

如何从日期中截取时间并将其传递给组件?

有谁能帮我修一下这个吗?使输出变得更加整洁

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

Java 21内置http客户端固定运营商线程

当我try 返回可选时,Mock无法正常工作

message.acknowledge()没有';在使用Spring Boot在ActiveMQ中读取消息后,t将消息出列

如何使用java区分以下结果

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?

在对象列表上调用提取后,如何判断没有值为空?