gpt4 book ai didi

java - 对对象列表中的数据进行分组和求和,同时保留插入顺序

转载 作者:行者123 更新时间:2023-12-04 01:06:10 31 4
gpt4 key购买 nike

我有一个 DijkstraWays 对象列表:

List<DijkstraWays> dijkstraWaysList= ...

DijkstraWays 具有以下属性和 getter:

class DijkstraWays {
String name;
Double cost;

public String getName() {
return name;
}

public Double getCost() {
return cost;
}
}

我需要按 name 对这个列表进行分组,并计算 cost 的总和。为此,我使用了以下代码:

Map<String, Double> result = dijkstraWaysList.stream()              
.collect(Collectors.groupingBy(DijkstraWays::getName,
Collectors.summingDouble(DijkstraWays::getCost)));

此代码有效,但它不保留 djkstraWaysList 列表中元素的插入顺序。这是因为 Collectors.groupingBy 返回一个 Map/HashMap,并且这种类型不保留插入顺序。

如何使用 Collectors.groupingByCollectors.summingDouble 保留 djkstraWaysList 列表的插入顺序?我在 Internet 上找到了几个示例,其中结果被转换为 LinkedHashMap,它保留了这一点,但没有一个可以插入 Collectors.summingDouble。示例:

dijkstraWays.stream()
.collect(Collectors.groupingBy(DijkstraWays::getName,
LinkedHashMap::new,
Collectors.toList()));

我还需要 cost 的总和,但在这些带有 LinkedHashMap 的示例中我不能将它与 groupby 一起使用。

谢谢。

最佳答案

Supplier<Map>对于 LinkedHashMap应该在 Collectors.summingDouble 中的下游收集器(在本例中为 Collectors.groupingBy )之前插入:

public static Map<String, Double> totalCostGroupByName(List<DijkstraWays> ways) {
return ways.stream()
.collect(Collectors.groupingBy(DijkstraWays::getName,
LinkedHashMap::new,
Collectors.summingDouble(DijkstraWays::getCost)
));
}

测试:

List<DijkstraWays> ways = Arrays.asList(
new DijkstraWays("AB", 3),
new DijkstraWays("AC", 5),
new DijkstraWays("AD", 4),
new DijkstraWays("BC", 3),
new DijkstraWays("AC", 2),
new DijkstraWays("AB", 6),
new DijkstraWays("CD", 10)
);

System.out.println(totalCostGroupByName(ways)); // {AB=9.0, AC=7.0, AD=4.0, BC=3.0, CD=10.0}

关于java - 对对象列表中的数据进行分组和求和,同时保留插入顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66380513/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com