递归统计

实现多叉树聚合统计:每一个节点包含用户信息,统计包含的用户总数(节点的用户总数是下面所有子节点的聚合统计)

首先挂所有的数据:

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);
		}	
	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值