繁体   English   中英

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

[英]Group and sum data from a list of objects while preserving the insertion order

我有一个DijkstraWays对象列表:

List<DijkstraWays> dijkstraWaysList= ...

DijkstraWays具有以下属性和 getter:

class DijkstraWays {
    String name;
    Double cost;

    public String getName() {
        return name;
    }

    public Double getCost() {
        return cost;
    }
}

costname对这个列表进行分组并计算总和。 为此,我使用了以下代码:

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

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

如何使用Collectors.groupingByCollectors.summingDouble保留djkstraWaysList列表的插入顺序? 我在互联网上找到了几个示例,其中结果被转换为LinkedHashMap ,它保留了这一点,但在这些示例中都无法插入Collectors.summingDouble 例子:

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

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

谢谢。

应将LinkedHashMapSupplier<Map>插入到Collectors.groupingBy中的下游收集器(在本例中为Collectors.summingDouble )之前:

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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM