构建一个Node树
2018-03-26 本文已影响17人
七弦桐语
方便遍历查找数据,比如存储机构人员数据。
建立 Node 对象
public class Node implements java.io.Serializable{
private int id;
private int parentId; // 父节点的ID
private Node parent; // 父节点
private List<Node> children; // 子节点集合
private int level; // 树的层级
private int sort;
private int rootId; // 根节点的ID
private String type; // 节点类型
private boolean isLeaf; // 是否是叶子节点
private String description; // 节点的描述
// ... 其他自定义属性
public Node() {
super();
}
// 构造器...
// set、get方法...
}
将集合建立成树结构
/**
* 将集合建立成树结构
*
* @param dirs
* @return
*/
@SuppressWarnings("unchecked")
public static List<Node> buildListToTree(List<Node> dirs) {
List<Node> roots = findRoots(dirs); // 找出集合中的根元素
List<Node> notRoots = (List<Node>) CollectionUtils.subtract(dirs, roots); // 集合相减,去除根元素的集合
for (Node root : roots) {
root.setChildren(findChildren(root, notRoots)); // 递归找子节点
}
return roots;
}
/**
* 找出集合中的根元素
*
* @param
* @return
*/
public static List<Node> findRoots(List<Node> allNodes) {
List<Node> results = new ArrayList<Node>();
for (Node node : allNodes) {
boolean isRoot = true;
for (Node comparedOne : allNodes) {
if (node.getParentId() == comparedOne.getId()) { // 如果存在当前Node的父ID,则当前节点不是根元素,反之,则是.
isRoot = false;
break;
}
}
if (isRoot) {
node.setLevel(0);
results.add(node);
node.setRootId(node.getId());
}
}
return results;
}
/**
* 递归找子目录
*
* @param root
* @param
* @return
*/
@SuppressWarnings("unchecked")
private static List<Node> findChildren(Node root, List<Node> allNodes) {
List<Node> children = new ArrayList<Node>();
for (Node comparedOne : allNodes) {
if (comparedOne.getParentId() == root.getId()) {
comparedOne.setParent(root);
comparedOne.setLevel(root.getLevel() + 1);
children.add(comparedOne);
}
}
List<Node> notChildren = (List<Node>) CollectionUtils.subtract(allNodes, children);
for (Node child : children) {
List<Node> tmpChildren = findChildren(child, notChildren); // 递归查找
if (tmpChildren == null || tmpChildren.size() < 1) { // 没有子节点,则为叶子节点
child.setLeaf(true);
} else {
child.setLeaf(false);
}
child.setChildren(tmpChildren);
}
return children;
}