实现多叉树聚合统计:每一个节点包含用户信息,统计包含的用户总数(节点的用户总数是下面所有子节点的聚合统计)
首先挂所有的数据:
private void traverseChild (List<Department> parentList, List<Department> allChild,
Map<Long, Department> mapNode) {
for(int i = 0; i < parentList.size(); i++) {
int currentOnline = 0;
//添加子节点
for(int j = 0; j < allChild.size(); j++) {
if(parentList.get(i).getId() == allChild.get(j).getParentId()) {
if(parentList.get(i).getChild() == null) {
parentList.get(i).setChild(new ArrayList<Department>());
}
if(allChild.get(j).getUsers() != null && allChild.get(j).getUsers().size() >0) {
int online = 0;
for(int k = 0; k < allChild.get(j).getUsers().size(); k++) {
if(allChild.get(j).getUsers().get(k).getOnline() != null &&
allChild.get(j).getUsers().get(k).getOnline() == 1) {
online++;
}
}
allChild.get(j).setOnlineUserCount(online);
allChild.get(j).setTotal(allChild.get(j).getUsers().size());
}
parentList.get(i).getChild().add(allChild.get(j));
}
}
if(parentList.get(i).getUsers() != null && parentList.get(i).getUsers().size() > 0) {
parentList.get(i).setTotal(parentList.get(i).getUsers().size());
for(int n = 0; n < parentList.get(i).getUsers().size(); n++) {
if(parentList.get(i).getUsers().get(n).getOnline() != null &&
parentList.get(i).getUsers().get(n).getOnline() == 1) {
currentOnline++;
}
}
parentList.get(i).setOnlineUserCount(currentOnline);
}
//递归遍历子节点
if(parentList.get(i).getChild() != null && parentList.get(i).getChild().size() > 0) {
mapNode.put(parentList.get(i).getId(), parentList.get(i));
traverseChild(parentList.get(i).getChild(), allChild, mapNode);
} else {
//叶子
parentList.get(i).setIsCount(true);
mapNode.put(parentList.get(i).getId(), parentList.get(i));
}
}
}
把所有的节点重复扫描:
private List<Department> countNode (Map<Long, Department> map, List<Department> parent) {
//重复扫描计算
traverseMapCountNode(map);
List<Department> root = new ArrayList<Department>();
parent.forEach(p -> {
root.add(map.get(p.getId()));
});
return root;
}
private void traverseMapCountNode(Map<Long, Department> mapNode) {
int nodeNum = 0;
for (Map.Entry<Long, Department> entry : mapNode.entrySet()) {
if(entry.getValue().getIsCount()) {
nodeNum++;
continue;
} else {
//非叶子
if(entry.getValue().getChild() != null || entry.getValue().getChild().size() > 0) {
int len = 0;
for(int i = 0; i < entry.getValue().getChild().size(); i++) {
if(entry.getValue().getChild().get(i).getIsCount()) {
len++;
}
}
if(len == entry.getValue().getChild().size()) {
for(int i = 0; i < entry.getValue().getChild().size(); i++) {
entry.getValue().setTotal(
entry.getValue().getTotal() +
entry.getValue().getChild().get(i).getTotal());
entry.getValue().setOnlineUserCount(
entry.getValue().getOnlineUserCount() +
entry.getValue().getChild().get(i).getOnlineUserCount());
}
entry.getValue().setIsCount(true);
} else {
continue;
}
}
}
}
if(nodeNum < mapNode.size()) {
traverseMapCountNode(mapNode);
}
}