最近做项目遇到树形结构的统计,树的的深度不定,父亲节点=孩子节点之和
使用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;
}
}
运行结果如下