我有这样一个使用情况,需要按多个分组条件聚合列表中的值,然后计算每个值的分布百分比并创建一个新列表。
以下是一个项目列表示例:
week1 source1 destination1 100
week1 source1 destination2 200
week1 source2 destination1 200
week1 source2 destination2 100
week2 source1 destination1 200
week2 source1 destination2 200
我想要按周和来源分组,并计算总数量,然后根据数量分配百分比。
例如,来自源1的第1周的总数量为300,其中100个送到目的地1,200个送到目的地2。现在,第1周来自源1到目的地1的分配比例为33.33%,而来自源1到目的地2的分配比例为66.66%
例如,输出将是:
week1 source1 destination1 33.33%
week1 source1 destination2 66.66%
week1 source2 destination1 66.66%
week1 source2 destination2 33.33%
week2 source1 destination1 50%
week2 source1 destination2 50%
如何使用Java 8的流实现此结果。
假设我有一个名为"records"的对象,它是这些对象的列表:
public class Record {
private String sourceNode;
private String destinationNode;
private String weekIndex;
private String quantity;
}
Map<String, Map<String, List<Record>>> RecordsGroupByWeekAndSource = records.stream()
.collect(Collectors.groupingBy(Record::getWeekIndex, Collectors.groupingBy(Record::getSourceNode)));
这将使我按周和来源对项目进行分组。但我必须再次遍历此映射以计算驻留在映射对象内部的每个列表中的总数量。但是否有一种方法可以在 groupingBy 集合本身中进行百分比计算?
Map<String, Map<String, Map<String, Double>>>
吗?此外,如果某个源在某周内没有出现,或者某个目的地在给定的周和源中没有出现,那么它们在结果中不出现也可以吗?(即结果中没有0%,除非输入中有0) - Didier L