部門樹形結構算法 — 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 長歌
 */
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;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM