构建一个Node树

作者: 七弦桐语 | 来源:发表于2018-03-26 22:40 被阅读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;
    }
    

    相关文章

      网友评论

        本文标题:构建一个Node树

        本文链接:https://www.haomeiwen.com/subject/yppdcftx.html