要实现的效果:累加叶子节点的数据到父节点上。
数据效果图如下:
数据库数据结构: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