代码:
/**
* Copyright © 2016 my. All rights reserved.
*/
package com.mycompay.mysystem;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
/**
* 根据拉平的树递归生成层次结构的树
*
* @author James 2016年11月14日 下午11:42:12
*
*/
public class GenTree {
/**
* 根据父节点获取所有子节点 如果父节点为null,则返回根节点
*
* @param node
* @return
*/
private static List<TreeNode> getChildNodes(final TreeNode parentNode,
List<TreeNode> allNodes) {
// 这里约定传入父节点为null就是查根节点
Predicate<TreeNode> predicate = null;
if (null == parentNode) {
// 约定ParentNodeNo为 null,""是跟节点
predicate = new Predicate<TreeNode>() {
public boolean apply(TreeNode treeNode) {
return Strings.isNullOrEmpty(treeNode.getParentNodeNo());
}
};
} else {
predicate = new Predicate<TreeNode>() {
// 查询子节点
public boolean apply(TreeNode treeNode) {
return StringUtils.equals(parentNode.getNodeNo(),
treeNode.getParentNodeNo());
}
};
}
return Lists.newArrayList(Iterables.filter(allNodes, predicate));
}
/**
* 根据父节点递归生成树
*
* @param parentNode
* @return
*/
private static TreeNode recurGenTree(TreeNode parentNode,
List<TreeNode> allNodes) {
// 查询子节点
List<TreeNode> childNodes = getChildNodes(parentNode, allNodes);
// 遍历子节点
for (TreeNode child : childNodes) {
TreeNode node = recurGenTree(child, allNodes);
parentNode.getChildNodes().add(node);
}
return parentNode;
}
/**
* @param args
*/
public static void main(String[] args) {
List<TreeNode> tree = Lists.newArrayList();
// 第一颗课树
tree.add(new TreeNode("1", "A", ""));
tree.add(new TreeNode("2", "B", "1"));
tree.add(new TreeNode("3", "C", "2"));
tree.add(new TreeNode("4", "D", "3"));
tree.add(new TreeNode("5", "E", "1"));
tree.add(new TreeNode("6", "F", "2"));
// 第二课树
tree.add(new TreeNode("11", "AA", ""));
tree.add(new TreeNode("22", "BB", "11"));
tree.add(new TreeNode("33", "CC", "22"));
tree.add(new TreeNode("44", "DD", "33"));
tree.add(new TreeNode("55", "EE", "11"));
tree.add(new TreeNode("66", "FF", "22"));
tree.add(new TreeNode("77", "GG", "66"));
tree.add(new TreeNode("88", "HH", "77"));
tree.add(new TreeNode("99", "II", "88"));
// 查询根节点
List<TreeNode> roots = getChildNodes(null, tree);
for (TreeNode node : roots) {
recurGenTree(node, tree);
}
for (TreeNode node : roots) {
System.out.println(JSON.toJSONString(node));
}
}
}
/**
* 拉平的树 对应数据库中一条记录
*
* @author James 2016年11月14日 下午11:45:50
*
*/
class TreeNode {
public TreeNode(String nodeNo, String nodeCode, String parentNodeNo) {
super();
this.nodeNo = nodeNo;
this.nodeCode = nodeCode;
this.parentNodeNo = parentNodeNo;
}
/**
* 节点唯一编号
*/
private String nodeNo;
/**
* 节点编码
*/
private String nodeCode;
/**
* 父节点编码
*/
private String parentNodeNo;
private List<TreeNode> childNodes = Lists.newArrayList();
/**
* 根据元数据递归生成到达节点路径
*/
private String path;
/**
* @return the nodeNo
*/
public String getNodeNo() {
return nodeNo;
}
/**
* @param nodeNo
* the nodeNo to set
*/
public void setNodeNo(String nodeNo) {
this.nodeNo = nodeNo;
}
/**
* @return the nodeCode
*/
public String getNodeCode() {
return nodeCode;
}
/**
* @param nodeCode
* the nodeCode to set
*/
public void setNodeCode(String nodeCode) {
this.nodeCode = nodeCode;
}
/**
* @return the parentNodeNo
*/
public String getParentNodeNo() {
return parentNodeNo;
}
/**
* @param parentNodeNo
* the parentNodeNo to set
*/
public void setParentNodeNo(String parentNodeNo) {
this.parentNodeNo = parentNodeNo;
}
/**
* @return the path
*/
public String getPath() {
return path;
}
/**
* @param path
* the path to set
*/
public void setPath(String path) {
this.path = path;
}
/**
* @return the childNodes
*/
public List<TreeNode> getChildNodes() {
return childNodes;
}
/**
* @param childNodes
* the childNodes to set
*/
public void setChildNodes(List<TreeNode> childNodes) {
this.childNodes = childNodes;
}
}
输出结果:
{"childNodes":[{"childNodes":[{"childNodes":[{"childNodes":[],"nodeCode":"D","nodeNo":"4","parentNodeNo":"3"}],"nodeCode":"C","nodeNo":"3","parentNodeNo":"2"},{"childNodes":[],"nodeCode":"F","nodeNo":"6","parentNodeNo":"2"}],"nodeCode":"B","nodeNo":"2","parentNodeNo":"1"},{"childNodes":[],"nodeCode":"E","nodeNo":"5","parentNodeNo":"1"}],"nodeCode":"A","nodeNo":"1","parentNodeNo":""}
{"childNodes":[{"childNodes":[{"childNodes":[{"childNodes":[],"nodeCode":"DD","nodeNo":"44","parentNodeNo":"33"}],"nodeCode":"CC","nodeNo":"33","parentNodeNo":"22"},{"childNodes":[{"childNodes":[{"childNodes":[{"childNodes":[],"nodeCode":"II","nodeNo":"99","parentNodeNo":"88"}],"nodeCode":"HH","nodeNo":"88","parentNodeNo":"77"}],"nodeCode":"GG","nodeNo":"77","parentNodeNo":"66"}],"nodeCode":"FF","nodeNo":"66","parentNodeNo":"22"}],"nodeCode":"BB","nodeNo":"22","parentNodeNo":"11"},{"childNodes":[],"nodeCode":"EE","nodeNo":"55","parentNodeNo":"11"}],"nodeCode":"AA","nodeNo":"11","parentNodeNo":""}