java 递归树从叶子层向上递归计算数据

一、递归计算每层数据,上层数据是下层数据之和

1、returnList对应的是要返回到前端的组织树;
 vehicleList对应的是所有的车辆信息,需要将车辆信息挂在组织上,并结算每层组织上车辆在线数据以及总数
// 将车辆信息挂在组织树上,并且返回对应的车辆信息
private List<SubRegionsRequest> cycleVehicle(List<SubRegionsRequest> returnList, List<FindVehicleRequest> vehicleList){
// 循环组织
returnList.forEach(r ->{
List<SubRegionsRequest> childList =r.getChildren();
     // 如果有下级数据,继续循环查询
if(CollectionUtils.isNotEmpty(childList)){
// 递归处理子区域数据
cycleVehicle(childList,vehicleList);
}
// 计算当前区域的在线车辆数和车辆总数
calculateVehicleCounts(r,vehicleList);
});
return returnList;
}
二、计算数量
   /**
   region 每层对象
   vehicleList 车辆集合
   */
// 计算当前区域的在线车辆数和车辆总数 private void calculateVehicleCounts(SubRegionsRequest region, List<FindVehicleRequest> vehicleList) {
// 如果当前层有子级,则当前层的数据是下级数据之和 if (CollectionUtils.isNotEmpty(region.getChildren())) {
// 得到当前层的子级集合 List<SubRegionsRequest> childList =region.getChildren();
// 计算总数 Integer total = childList.stream().mapToInt(SubRegionsRequest::getLevelCount).sum();
// 计算在线数 Integer onTotal =childList.stream().mapToInt(SubRegionsRequest::getOnCount).sum();
// 修改树的显示数据 region.setName(region.getName()+"("+onTotal+"/"+total+")");
// 给当前层设置数据 region.setLevelCount(total); region.setOnCount(onTotal); }else{ // 筛选当前区域的车辆 List<FindVehicleRequest> vehiclesInRegion = vehicleList.stream() .filter(v -> v.getRegionIndexCode().equals(region.getIndexCode())) .collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(vehiclesInRegion)){ List<SubRegionsRequest> showList =ModelConverterUtils.convert(vehiclesInRegion,SubRegionsRequest.class); region.setChildren(showList); } // 计算在线车辆数 int onlineCount = vehiclesInRegion.stream().filter(v -> "1".equals(v.getStatus())).collect(Collectors.toList()).size(); // 计算车辆总数 int totalVehicleCount = vehiclesInRegion.size(); // 设置在线车辆数和车辆总数 region.setOnCount(onlineCount); region.setLevelCount(totalVehicleCount); // 更新区域名称 region.setName(region.getName() + "(" + onlineCount + "/" + totalVehicleCount + ")"); } }

  

posted @ 2024-05-22 17:05  flyComeOn  阅读(259)  评论(0编辑  收藏  举报