我爱编程程序员

构建一个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;
}
上一篇下一篇

猜你喜欢

热点阅读