一、场景
记录解决树形列表中,父级中的某个属性需要由自身和子集累加的一个方法(递归)。
二、解决方案
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"); //当前层级idcDto1.setName("栏目1-1-1"); //层级名称cDto1.setPid("1-1"); //父级idcDto1.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 这个为我项目中的示例类,仅为示例,实际生产改成自己的就好,只要保证树形结构即可。
方法很简单,没什么好解释的,就是通过递归调用,不断累加。