树形结构统计-递归统计(父亲节点=孩子节点之和)

最近做项目遇到树形结构的统计,树的的深度不定,父亲节点=孩子节点之和

使用java实现如下:

实体bean代码如下:

package tt;

public class Xmzb {
	private String id;
	private String pid;
	/**
	 * 项目个数
	 */
	private Integer xmgs;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPid() {
		return pid;
	}
	public void setPid(String pid) {
		this.pid = pid;
	}
	public Integer getXmgs() {
		return xmgs;
	}
	public void setXmgs(Integer xmgs) {
		this.xmgs = xmgs;
	}
	public Xmzb(String id, String pid, Integer xmgs) {
		super();
		this.id = id;
		this.pid = pid;
		this.xmgs = xmgs;
	}
	 

}
统计demo代码如下:

package tt;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class XxfMain {

	public static List<Xmzb>allList=new ArrayList<Xmzb>();
	public static void main(String[] args) {
		Xmzb root=new Xmzb("1","0",null);
		Xmzb root1_1=new Xmzb("1-1","1",null);
		Xmzb root1_2=new Xmzb("1-2","1",null);
		Xmzb root1_1_1=new Xmzb("1-1-1","1-1",1);
		Xmzb root1_1_2=new Xmzb("1-1-2","1-1",null);
		Xmzb root1_2_1=new Xmzb("1-2-1","1-2",1);
		Xmzb root1_2_2=new Xmzb("1-2-2","1-2",1);
		allList.add(root);
		allList.add(root1_1);
		allList.add(root1_2);
		allList.add(root1_1_1);
		allList.add(root1_1_2);
		allList.add(root1_2_1);
		allList.add(root1_2_2);
		List<Xmzb>list=new ArrayList<Xmzb>();
		list.add(root);
		doCount(root,list);
		for (Xmzb xmzb : allList) {
			 System.out.println(xmzb.getId()+":"+xmzb.getXmgs());
		}

	}
	
	public static  Map<String,Object>  doCount(Xmzb root ,List<Xmzb> list){
		Map<String,Object>map=new HashMap<String,Object>();
		Double xmgs = 0.0;
		
		List<Xmzb> clist=findByQueryString(root.getId());//此处可以使用sql通过父节点查询孩子节点sql:from Xmzb where year='2016' and pid='"+root.getId()+"'
		if(clist==null ||clist.size()==0){
			if(null!=root.getXmgs()){ 
				map.put("xmgs", root.getXmgs());
			}else{
				map.put("xmgs", xmgs);
			}
			return map;
		}
		if(clist!=null &&clist.size()>0){
			list.addAll(clist);
			for (Xmzb child : clist) {
					//递归
					Map<String,Object>map_c=doCount(child,list);
					Double res=Double.parseDouble(map_c.get("xmgs").toString());
						child.setXmgs(res.intValue());
				    //统计当前元素的子节点个数
					xmgs+=res;
				}
				
			}
			root.setXmgs(xmgs.intValue());
			map.put("xmgs", xmgs);
			map.put("list", list);
			return map;
	}
	public static List<Xmzb>findByQueryString(String pid){
		List<Xmzb>list=new ArrayList<Xmzb>();
		for (Xmzb xmzb : allList) {
			if(xmzb.getPid().equals(pid)){
				list.add(xmzb);
			}
		}
		return list;
		
	}

}

运行结果如下




  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值