作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有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/
我是一名优秀的程序员,十分优秀!