部门树形结构算法 — Java递归实现

文章描述了如何使用Java实现将查询到的部门列表数据按照父子节点关系转换成树形结构的过程,包括创建数据库表、实体类定义以及使用递归方法构建树结构的方法示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将查询到的部门列表数据,进行父子节点树形结构排序
该功能适用需要树形结构的,不仅仅是部门树

步骤:

  1. 查询数据库,获得所有的部门列表
  2. 调用下面的实现方法
一、建表语句
CREATE TABLE `dept` (
  `deptId` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(32) DEFAULT NULL COMMENT '部门名称',
  `parentId` bigint(20) DEFAULT NULL COMMENT '父级部门ID',
  PRIMARY KEY (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

数据例如:

 

二、实现方法代码:
import com.alibaba.fastjson2.JSON;

import java.util.ArrayList;
import java.util.List;

public class demo {
    /**
     * 部门实体
     *
     */
    public static class Dept {

        /**
         * 部门id
         */
        private String deptId;

        /**
         * 部门名称
         */
        private String name;

        /**
         * 父部门id
         */
        private String parentId;

        /**
         * 子部门
         */
        private List<Dept> children = new ArrayList<>();

        public String getDeptId() {
            return deptId;
        }

        public void setDeptId(String deptId) {
            this.deptId = deptId;
        }

        public String getName() {
            return name;
        }

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

        public String getParentId() {
            return parentId;
        }

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

        public List<Dept> getChildren() {
            return children;
        }

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

    public static void main(String[] arg) {
        List<Dept> deptList = new ArrayList<>();
        //添加第一级
        Dept dept = new Dept();
        dept.setDeptId("1000");
        dept.setParentId("0");
        dept.setName("康复中心门诊");
        deptList.add(dept);

        Dept dept1 = new Dept();
        dept1.setDeptId("1001");
        dept1.setParentId("0");
        dept1.setName("妇产科");
        deptList.add(dept1);

        Dept dept2 = new Dept();
        dept2.setDeptId("1002");
        dept2.setParentId("0");
        dept2.setName("骨伤科");
        deptList.add(dept2);

        //添加第二级
        Dept dept3 = new Dept();
        dept3.setDeptId("10021");
        dept3.setParentId("1002");
        dept3.setName("颈肩腰腿痛专科门诊");
        deptList.add(dept3);

        Dept dept4 = new Dept();
        dept4.setDeptId("10022");
        dept4.setParentId("1002");
        dept4.setName("骨伤二科(康复六科)门诊");
        deptList.add(dept4);

        Dept dept5 = new Dept();
        dept5.setDeptId("10001");
        dept5.setParentId("1000");
        dept5.setName("肌骨疼痛康复门诊");
        deptList.add(dept5);

        Dept dept6 = new Dept();
        dept6.setDeptId("10002");
        dept6.setParentId("1000");
        dept6.setName("脑卒中康复门诊");
        deptList.add(dept6);

        //添加第三级
        Dept dept7 = new Dept();
        dept7.setDeptId("100021");
        dept7.setParentId("10002");
        dept7.setName("脑卒中康复门诊-小门诊");
        deptList.add(dept7);

        Dept dept8 = new Dept();
        dept8.setDeptId("100022");
        dept8.setParentId("10002");
        dept8.setName("脑卒中康复门诊-小门诊-小小门诊");
        deptList.add(dept8);

        List<Dept> deptListNew = buildDeptTree(deptList);
        System.out.println(deptListNew.size());
        for (Dept dept9 : deptListNew) {
            System.out.println("一级信息:" + JSON.toJSONString(dept9));
            if (hasChild(dept9.getChildren(), dept9)) {
                for (Dept dept10 : dept9.getChildren()) {
                    //System.out.println("二级信息:" + JSON.toJSONString(dept10));
                    if (hasChild(dept10.getChildren(), dept10)) {
                        for (Dept dept11 : dept10.getChildren()) {
                            //System.out.println("三级信息:" + JSON.toJSONString(dept11));
                        }
                    }
                }
            }
        }
        //3
        //一级信息:{"children":[{"children":[],"deptId":"10001","name":"肌骨疼痛康复门诊","parentId":"1000"},{"children":[{"children":[],"deptId":"100021","name":"脑卒中康复门诊-小门诊","parentId":"10002"},{"children":[],"deptId":"100022","name":"脑卒中康复门诊-小门诊-小小门诊","parentId":"10002"}],"deptId":"10002","name":"脑卒中康复门诊","parentId":"1000"}],"deptId":"1000","name":"康复中心门诊","parentId":"0"}
        //一级信息:{"children":[],"deptId":"1001","name":"妇产科","parentId":"0"}
        //一级信息:{"children":[{"children":[],"deptId":"10021","name":"颈肩腰腿痛专科门诊","parentId":"1002"},{"children":[],"deptId":"10022","name":"骨伤二科(康复六科)门诊","parentId":"1002"}],"deptId":"1002","name":"骨伤科","parentId":"0"}
    }

    /**
     * 构建前端所需要树结构
     *
     * @param depts 部门列表
     * @return 树结构列表
     */
    public static List<Dept> buildDeptTree(List<Dept> depts) {
        List<Dept> deptList = new ArrayList<>();
        List<String> deptIdList = new ArrayList<>();
        for (Dept dept : depts) {
            deptIdList.add(dept.getDeptId());
        }
        for (Dept dept : depts) {
            // 如果是顶级节点,遍历该父节点所有子节点
            if (!deptIdList.contains(dept.getParentId())) {
                recursionFn(depts, dept);
                deptList.add(dept);
            }
        }
        if (deptList.isEmpty()) {
            deptList = depts;
        }
        return deptList;
    }

    /**
     * 递归列表
     * 结束条件为所遍历的节点无下一级节点
     *
     * @param list 查询获得的所有部门数据
     * @param dept 顶级节点
     */
    private static void recursionFn(List<Dept> list, Dept dept) {
        // 得到子节点列表
        List<Dept> childList = getChildList(list, dept);
        dept.setChildren(childList);
        for (Dept tChild : childList) {
            // 如果子节点有下一级节点,得到下一级的节点列表
            if (hasChild(list, tChild)) {
                recursionFn(list, tChild);
            }
        }
    }

    /**
     * 获得该节点的下一级子节点列表
     *
     * @param list 查询获得的所有部门数据
     * @param dept 顶级节点
     * @return 顶级节点的下一级子节点列表
     */
    private static List<Dept> getChildList(List<Dept> list, Dept dept) {
        List<Dept> deptList = new ArrayList<>();
        for (Dept d : list) {
            // 遍历非顶级节点,并获得传入参数顶级节点的下一级子节点列表
            if (d.getParentId() != null && d.getParentId().equals(dept.getDeptId())) {
                deptList.add(d);
            }
        }
        return deptList;
    }

    /**
     * 判断是否有子节点
     *
     * @param list 节点列表
     * @param dept 部门节点
     * @return Boolean
     */
    private static boolean hasChild(List<Dept> list, Dept dept) {
        return getChildList(list, dept).size() > 0;
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值