递归:向下遍历叶子节点,累加叶子节点的数据到父节点上

 

要实现的效果:累加叶子节点的数据到父节点上。

数据效果图如下:

数据库数据结构:dept_id,parent_id,people_number

INSERT INTO `<table_name>` VALUES (100, 0, NULL);
INSERT INTO `<table_name>` VALUES (101, 100, NULL);
INSERT INTO `<table_name>` VALUES (102, 100, NULL);
INSERT INTO `<table_name>` VALUES (104, 101, 1);
INSERT INTO `<table_name>` VALUES (105, 101, 3);
INSERT INTO `<table_name>` VALUES (106, 101, NULL);
INSERT INTO `<table_name>` VALUES (108, 102, NULL);
INSERT INTO `<table_name>` VALUES (109, 102, NULL);

后台处理逻辑:

   1.查询出所有数据的集合

   2.java8根据oarentId分组,取出所有父节点的deptId

   3.向下递归调用计算结果

private List<SysDept> getPeopleNumberBy(List<SysDept> sysDeptLists) {
        List<SysDept> sysDeptListsCopy = new ArrayList<>();
        sysDeptListsCopy.addAll(sysDeptLists);
        for (int i = 0; i < sysDeptLists.size(); i++) {
            SysDept sysDept = sysDeptLists.get(i);
            Long deptIdTemp = sysDept.getDeptId();
            Stream<SysDept> stream = sysDeptListsCopy.stream();
            Map<Long,List<SysDept>> map = stream.collect(Collectors.groupingBy(SysDept::getParentId));
            Set keySet = map.keySet();
            Iterator it = keySet.iterator();
            while(it.hasNext()){
                Long k = (Long)it.next();
                List<SysDept> depts = map.get(k);
                int peopleNumber = 0;
                peopleNumber = getChildrenNumber(depts, map, peopleNumber);
                if (deptIdTemp == k) {
                    sysDept.setPeopleNumber(peopleNumber);
                }
            }
        }
        return sysDeptLists;
    }

    private int getChildrenNumber(List<SysDept> depts, Map<Long,List<SysDept>> map, int peopleNumber){
        for (SysDept sysDeptTemp1: depts) {
            Long deptId = sysDeptTemp1.getDeptId();
            List<SysDept> childrenList = map.get(deptId);
            if (childrenList != null  && childrenList.size() != 0){
                // 递归调用
                peopleNumber = getChildrenNumber(childrenList, map, peopleNumber);
            }
            peopleNumber += sysDeptTemp1.getPeopleNumber();
        }
        return peopleNumber;
    }

没有数据库的可以直接main方法构建一个sysDeptLists

 

 

 

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

buyaopingbixiazai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值