用Java构建部门树

首先代码以后可以优化成stream流,但是为了方便可读性暂时不用 (可自行优化)

    public void testTree() {
        List<AppFolder> all = appFolderMapper.selectAll();
        List<AppFolderVo> voList = new ArrayList<>();
        for (AppFolder appFolder : all) {
            AppFolderVo vo = new AppFolderVo();
            BeanUtil.copyProperties(appFolder,vo);
            voList.add(vo);
        }
        buildeDepetTree(voList);
    }


    private List<AppFolderVo> buildeDepetTree(List<AppFolderVo> depts){
        //存放构建好的部门树
        ArrayList<AppFolderVo> deptTrees = new ArrayList<>();

        //存放顶级父部门
        ArrayList<AppFolderVo> parents = new ArrayList<>();
        
        //先寻找顶级父部门 可以优化成stream流的写法
        for (AppFolderVo dept : depts) {
            AppFolderVo vo = buildeParent(dept, depts);
            if (!parents.contains(vo)){
                parents.add(vo);
            }
        }

        
        //寻找孩子
        for (AppFolderVo parent : parents) {
            AppFolderVo appFolderVo = buildTree(parent, depts);
            deptTrees.add(appFolderVo);
        }

        return deptTrees;
    }

    private AppFolderVo buildTree(AppFolderVo parent, List<AppFolderVo> depts) {
        ArrayList<AppFolderVo> childrens = new ArrayList<>();
        for (AppFolderVo vo : depts) {
            if (parent.getId().equals(vo.getParentId())){
                childrens.add(buildTree(vo,depts));
            }
        }
        parent.setChildrenFolders(childrens);
        return parent;
    }

    //
    private AppFolderVo buildeParent(AppFolderVo dept, List<AppFolderVo> depts) {
        AppFolderVo parent = dept;
        for (AppFolderVo folderVo : depts) {
            if (dept.getParentId().equals(folderVo.getId())){
                parent = buildeParent(folderVo,depts);
            }
        }
        return parent;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现部门层级,可以使用形数据结构。以下是一个简单的 Java 实现示例: 首先,需要定义一个部门类,包含部门 ID、父部门 ID、部门名称等属性: ``` public class Department { private int id; private int parentId; private String name; // 构造方法、getter、setter 略 } ``` 接下来,可以定义一个方法,接收部门列表作为参数,返回一个根据部门层级关系构建形结构: ``` public static List<Department> buildDepartmentTree(List<Department> departmentList) { // 首先,将所有部门按照父部门 ID 分组 Map<Integer, List<Department>> departmentMap = departmentList.stream() .collect(Collectors.groupingBy(Department::getParentId)); // 然后,递归构建形结构 List<Department> rootDepartments = departmentMap.get(0); for (Department department : rootDepartments) { buildDepartmentTree(department, departmentMap); } return rootDepartments; } private static void buildDepartmentTree(Department department, Map<Integer, List<Department>> departmentMap) { List<Department> subDepartments = departmentMap.get(department.getId()); if (subDepartments != null) { department.setSubDepartments(subDepartments); for (Department subDepartment : subDepartments) { buildDepartmentTree(subDepartment, departmentMap); } } } ``` 上述代码中,首先将所有部门按照父部门 ID 分组,然后从根节点开始递归构建形结构,直到所有节点都被加入到中。 最后,可以通过递归遍历形结构,将部门层级打印出来: ``` public static void printDepartmentTree(List<Department> departmentList, int level) { if (departmentList == null || departmentList.isEmpty()) { return; } for (Department department : departmentList) { System.out.println(String.join("", Collections.nCopies(level, "-")) + department.getName() + " (" + department.getId() + ")"); printDepartmentTree(department.getSubDepartments(), level + 1); } } ``` 这样,就可以通过以下代码来构建和打印部门层级: ``` List<Department> departmentList = Arrays.asList( new Department(1, 0, "总公司"), new Department(2, 1, "财务部"), new Department(3, 1, "人力资源部"), new Department(4, 2, "财务一部"), new Department(5, 2, "财务二部"), new Department(6, 3, "招聘组"), new Department(7, 3, "培训组") ); List<Department> departmentTree = buildDepartmentTree(departmentList); printDepartmentTree(departmentTree, 0); ``` 输出结果如下: ``` 总公司 (1) -财务部 (2) --财务一部 (4) --财务二部 (5) -人力资源部 (3) --招聘组 (6) --培训组 (7) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值