代码修改自: https://blog.csdn.net/xuxingfan000/article/details/52159851
感谢@xuxingfan000
最近做项目遇到树形结构的统计,树的的深度不定,父亲节点=孩子节点之和
本修改代码要实现父亲节点的计数要追加父亲节点本身的数量.
实体bean代码略 参考上述链接
统计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", 0);
Xmzb root1_1 = new Xmzb("1-1", "1", 3999);
Xmzb root1_2 = new Xmzb("1-2", "1", 1);
Xmzb root1_1_1 = new Xmzb("1-1-1", "1-1", 1);
Xmzb root1_1_2 = new Xmzb("1-1-2", "1-1", 0);
Xmzb root1_2_1 = new Xmzb("1-2-1", "1-2", 1);
Xmzb root1_2_2 = new Xmzb("1-2-2", "1-2", 0);
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) {
// System.out.println(root.getXmgs());
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(root.getXmgs() + xmgs.intValue());
map.put("xmgs", root.getXmgs());
/
//注意这两行修改//
/
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;
}
}
运行结果如下