コードの変更元:https:
//blog.csdn.net/xuxingfan000/article/details/52159851ありがとう@ xuxingfan000
最近、プロジェクトでツリー構造の統計が発生しました。ツリーの深さは不明です。親ノード=子ノードの合計。親ノード
の数を取得するには、変更されたコードで親ノードの数を追加する必要があります。 。自分自身のために
エンティティBeanのコード、上記のリンクを参照してください。
統計は、次のようにコードが変更されたデモ:
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;
}
}
結果は以下のとおりです。