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

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

步骤:

  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

数据例如:

二、Java实体类
package com.changge.pojo;

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

/**
 * 部门实体
 *
 * @author changge
 */
public class Dept {

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

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

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

    /**
     * 子部门
     */
    private List<Dept> children = new ArrayList<>();
    
    // get,set等方法省略
    ...
三、实现方法代码
    /**
     * 构建前端所需要树结构
     *
     * @param depts 部门列表
     * @return 树结构列表
     */
    public 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 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 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 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、付费专栏及课程。

余额充值