解决树形列表中数值层级累加

发布于:2024-12-20 ⋅ 阅读:(5) ⋅ 点赞:(0)

一、场景

        记录解决树形列表中,父级中的某个属性需要由自身和子集累加的一个方法(递归)。

二、解决方案

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 这个为我项目中的示例类,仅为示例,实际生产改成自己的就好,只要保证树形结构即可。

        方法很简单,没什么好解释的,就是通过递归调用,不断累加。


网站公告

今日签到

点亮在社区的每一天
去签到