Java 实现无限层级树形结构遍历部门


代码如下:

/**
 * 部门实体类
 */
public class Department {

    public Department(Integer id, String name, Integer parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
    }

    private Integer id;
    private String name;

    /**
     * 上级部门 id
     */
    private Integer parentId;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }
}

/**
 * 树形节点实体类
 */
public class TreeNode {

    public TreeNode(Integer id, String name, Integer parentId, List children) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.children = children;
    }

    private Integer id;
    private String name;

    /**
     * 父级节点 id
     */
    private Integer parentId;

    /**
     * 子级节点
     */
    private List children;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

    public List getChildren() {
        return children;
    }

    public void setChildren(List children) {
        this.children = children;
    }

    /**
     * 循环遍历出子节点
     * @param parentId
     * @param treeNodeList
     * @return
     */
    public List forEachChildrenTreeNode(int parentId, List treeNodeList) {
        List children = new ArrayList<>(0);
        for (TreeNode treeNode : treeNodeList) {
            if (treeNode.getParentId() != null && treeNode.getParentId().equals(parentId)) {
                children.add(treeNode);
            }
        }

        for (TreeNode child : children) {
            List childChildren = forEachChildrenTreeNode(child.getId(), treeNodeList);
            if (childChildren == null) {
                childChildren = new ArrayList<>(0);
            }
            child.setChildren(childChildren);
        }

        if (children.size() == 0) {
            return null;
        }
        return children;
    }

    /**
     * 测试代码
     */
    public void testApp() {

        List departmentList = new ArrayList<>(6);
        departmentList.add(new Department(1, "测试集团公司1", null));
        departmentList.add(new Department(2, "测试分公司1", 1));
        departmentList.add(new Department(3, "测试分公司2", 1));
        departmentList.add(new Department(4, "测试子部门1", 3));
        departmentList.add(new Department(5, "测试项目室1", 4));
        departmentList.add(new Department(6, "测试项目组1", 5));
        departmentList.add(new Department(7, "测试项目室2", 4));
        departmentList.add(new Department(8, "测试子部门2", 3));
        departmentList.add(new Department(9, "测试分公司3", 1));
        departmentList.add(new Department(10, "测试集团公司2", null));

        /**
         * 将部门数据转成树形节点
         */
        List treeNodeList = new ArrayList<>(10);
        for (Department department : departmentList) {
            treeNodeList.add(new TreeNode(department.getId(), department.getName(), department.getParentId(), new ArrayList<>()));
        }

        /**
         * 最终输出的树形结构类结果数据
         */
        List treeNodeResultList = new ArrayList<>(0);

        /**
         * 将 parentId 为空的顶层节点首先写入结果数据
         */
        for (TreeNode treeNode : treeNodeList) {
            if (treeNode.getParentId() == null) {
                treeNodeResultList.add(treeNode);
            }
        }

        /**
         * 循环所有在结果数据中的顶层节点,并将子级节点装载进顶层节点的 children 属性
         */
        for (TreeNode treeNode : treeNodeResultList) {
            treeNode.setChildren(forEachChildrenTreeNode(treeNode.getId(), treeNodeList));
        }

        /**
         * 将结果数据以 JSON 格式输出
         */
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            System.out.println(objectMapper.writeValueAsString(treeNodeResultList));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

输出结果如下图:


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注