在最近的实习中,遇到了一个需求,麻烦了好几久,网上搜索也搜索不到,因此把本次经验记录下来为以后的自己或各位朋友提供一种思路。
有一个这样的列表,我需要通过大区与MAC进行分组,并把分组统计之后的数据求和插入列表,效果图如下
可以通过stream流进行计算,代码如下
Map<String, List<ReportPassengerFlowData>> dataGroupByRegion = dataList.stream()
.collect(Collectors.groupingBy(ReportPassengerFlowData::getRegion));
dataGroupByRegion.entrySet().stream().forEach(new Consumer<Map.Entry<String, List<ReportPassengerFlowData>>>() {
@Override
public void accept(Map.Entry<String, List<ReportPassengerFlowData>> stringListEntry) {
List<ReportPassengerFlowData> value = stringListEntry.getValue();
Map<String, List<ReportPassengerFlowData>> collect = value.stream().collect(Collectors.groupingBy(ReportPassengerFlowData::getMac));
collect.entrySet().forEach(stringListEntry1 -> {
List<ReportPassengerFlowData> value1 = stringListEntry1.getValue();
ReportPassengerFlowData reportPassengerFlowData = new ReportPassengerFlowData("", value1.get(0).getMac() + " 汇总", "", "", 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D);
//循环得到mac的数据
value1.forEach(a -> {
sumData(reportPassengerFlowData, a);
});
//填入MAC误差率
setDiff(reportPassengerFlowData);
//判断插值中是否有Nan和isInfinite
isNan(reportPassengerFlowData);
//得到mac分组的最后一个元素的索引
int i = dataList.indexOf(value1.get(value1.size() - 1));
//在mac的最后添加MAC汇总
dataList.add(i + 1, reportPassengerFlowData);
});
//得到当前大区汇总的数据
ReportPassengerFlowData reportPassengerFlowData = new ReportPassengerFlowData(value.get(0).getRegion() + " 汇总", "", "", "", 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D);
value.forEach(a -> {
sumData(reportPassengerFlowData, a);
});
//填入大区误差率
setDiff(reportPassengerFlowData);
//判断插值中是否有Nan和isInfinite
isNan(reportPassengerFlowData);
//计算总计
sumData(sumAllData, reportPassengerFlowData);
//得到大区分组的最后一个元素的索引
int i = dataList.indexOf(value.get(value.size() - 1));
//在大区的最后添加大区汇总
dataList.add(i + 2, reportPassengerFlowData);
}
});
先将dataList通过大区分组,在大区分组中在进行对Mac分组。
//大区分组
Map<String, List<ReportPassengerFlowData>> dataGroupByRegion = dataList.stream()
.collect(Collectors.groupingBy(ReportPassengerFlowData::getRegion));
dataGroupByRegion.entrySet().stream().forEach(new Consumer<Map.Entry<String, List<ReportPassengerFlowData>>>() {
//进行Mac分组
```
List<ReportPassengerFlowData> value = stringListEntry.getValue();
Map<String, List<ReportPassengerFlowData>> collect = value.stream().collect(Collectors.groupingBy(ReportPassengerFlowData::getMac));
collect.entrySet().forEach()
```
})
在Mac分组中,得到mac汇总数据 如 lin0汇总,这时我们考虑如何插入数据, 我们可以得到当前mac分组的最后一个元素,通过索引来得到最后一个元素在datalist的位置,通过datalist的add方法(索引,数据),索引即为mac最后一个元素的索引+1
大区分组同理