一、场景
记录解决树形列表中,父级中的某个属性需要由自身和子集累加的一个方法(递归)。
二、解决方案
public static void main(String[] args) throws Exception {
List<NewsCategoryStaticDto> dataList = new ArrayList<>();
/**
* 构造树形列表数据
* 栏目1
* 栏目1-1
* 栏目1-1-1
* 栏目2
*/
List<NewsCategoryStaticDto> childList1 = new ArrayList<>();
NewsCategoryStaticDto cDto1 = new NewsCategoryStaticDto();
cDto1.setId("1-1-1"); //当前层级id
cDto1.setName("栏目1-1-1"); //层级名称
cDto1.setPid("1-1"); //父级id
cDto1.setNewsTotal(new BigDecimal(1)); //需要累加的数量
childList1.add(cDto1);
cDto1 = new NewsCategoryStaticDto();
cDto1.setId("1-1");
cDto1.setName("栏目1-1");
cDto1.setPid("1");
cDto1.setNewsTotal(new BigDecimal(1));
cDto1.setChildrenList(childList1);
childList1 = new ArrayList<>();
childList1.add(cDto1);
NewsCategoryStaticDto staticDto1 = new NewsCategoryStaticDto();
staticDto1.setId("1");
staticDto1.setName("栏目1");
staticDto1.setPid("0");
staticDto1.setNewsTotal(new BigDecimal(1));
staticDto1.setChildrenList(childList1);
dataList.add(staticDto1);
NewsCategoryStaticDto staticDto2 = new NewsCategoryStaticDto();
staticDto2.setId("2");
staticDto2.setName("栏目2");
staticDto2.setPid("0");
staticDto2.setNewsTotal(new BigDecimal(2));
dataList.add(staticDto2);
//打印统计前的数据
System.out.println(JSONArray.toJSONString(dataList));
for (NewsCategoryStaticDto staticDto : dataList) {
doStaticTreeNum(staticDto);
}
//打印统计后的数据
System.out.println(JSONArray.toJSONString(dataList));
}
/**
* 统计值累计
* @param staticDto
*/
private static void doStaticTreeNum(NewsCategoryStaticDto staticDto) {
if (null == staticDto) {
return;
}
List<NewsCategoryStaticDto> childrenList = staticDto.getChildrenList();
if (null == childrenList || childrenList.size() == 0) {
return;
}
for (NewsCategoryStaticDto cDto : childrenList) {
//递归调用
doStaticTreeNum(cDto);
//当前层级的数据 由自身 + 子集
BigDecimal newTotal = staticDto.getNewsTotal().add(cDto.getNewsTotal());
staticDto.setNewsTotal(newTotal);
}
}
注:
NewsCategoryStaticDto 这个为我项目中的示例类,仅为示例,实际生产改成自己的就好,只要保证树形结构即可。
方法很简单,没什么好解释的,就是通过递归调用,不断累加。