1. 程式人生 > 實用技巧 >樹結構工具類(一)

樹結構工具類(一)

選單Menu:

package com.jc.bean;

import java.util.List;

/**
 * 選單
 * @author wang-xiaoming
 *
 */
public class Menu {
    // 選單id
    private String id;
    // 選單名稱
    private String name;
    // 父選單id
    private String pId;
    // 選單url
    private String url;
    // 選單圖示
    private String icon;
    // 選單順序
    private
int order; // 子選單 private List<Menu> childMenus; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }
public String getpId() { return pId; } public void setpId(String pId) { this.pId = pId; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getIcon() { return icon; }
public void setIcon(String icon) { this.icon = icon; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public List<Menu> getChildMenus() { return childMenus; } public void setChildMenus(List<Menu> childMenus) { this.childMenus = childMenus; } public Menu(String id, String name, String pId) { super(); this.id = id; this.name = name; this.pId = pId; } @Override public String toString() { return "Menu [id=" + id + ", name=" + name + ", pId=" + pId + ", url=" + url + ", icon=" + icon + ", order=" + order + ", childMenus=" + childMenus + "]"; } }

工具類MenuUtil:

package com.jc.util;

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

import com.jc.bean.Menu;

/**
 * 選單工具類
 * @author wang-xiaoming
 *
 */
public class MenuUtil {

    // 私有構造
    private MenuUtil() {
    }
    
    // 測試選單列表
    private static List<Menu> list = new ArrayList<>(16);
    
    // 初始化
    static {
        list.add(new Menu("1","勞務管理","0"));
        list.add(new Menu("2","裝置管理","0"));
        list.add(new Menu("3","物料管理","0"));
        list.add(new Menu("4","施工安全","0"));
        list.add(new Menu("5","施工質量","0"));
        list.add(new Menu("6","施工進度","0"));
        list.add(new Menu("7","技術難點","0"));
        list.add(new Menu("8","資料查詢","0"));
        list.add(new Menu("9","任務管理","0"));
        list.add(new Menu("10","物聯感控","0"));
        list.add(new Menu("11","考勤","1"));
        list.add(new Menu("12","專案部","1"));
        list.add(new Menu("13","勞務隊","1"));
        list.add(new Menu("14","勞務分析","1"));
        list.add(new Menu("15","工資結算","1"));
        list.add(new Menu("16","健康防控","1"));
        list.add(new Menu("17","教育培訓","1"));
        list.add(new Menu("18","當前位置","2"));
        list.add(new Menu("19","行駛軌跡","2"));
        list.add(new Menu("20","工作狀態","2"));
        list.add(new Menu("21","裝置總覽","2"));
        list.add(new Menu("22","裝置搜尋","2"));
        list.add(new Menu("23","原材資訊","3"));
        list.add(new Menu("24","地磅資料","3"));
        list.add(new Menu("25","出入庫","3"));
        list.add(new Menu("26","教育培訓","4"));
        list.add(new Menu("27","教育培訓","5"));
        list.add(new Menu("28","教育培訓","6"));
        list.add(new Menu("29","教育培訓","7"));
        list.add(new Menu("30","教育培訓","12"));
    }
    
    // 第二步:遞迴用到的獲取子級選單列表
    public static List<Menu> getChild(String id, List<Menu> rootMenu){
        List<Menu> childList = new ArrayList<>(16);
        // 為父選單尋找子選單列表,如果id=pId,則圈起來
        for (Menu menu : rootMenu) {
            if(id.equals(menu.getpId())){
                childList.add(menu);
            }
        }
        
        // 把子選單的子選單補充完整
        for (Menu menu : childList) {
            menu.setChildMenus(getChild(menu.getId(), rootMenu));
        }
        
        return childList;
    }
    
    // 第一步:獲取一級選單列表
    public static List<Menu> getRootMenu(List<Menu> list){
        List<Menu> menuList = new ArrayList<>(16);
        for (Menu menu : list) {
            if("0".equals(menu.getpId())){
                menuList.add(menu);
            }
        }
        return menuList;
    }
    
    // 驗證
    public static void main(String[] args) {
        System.out.println("---遞迴前---");
        for (Menu menu : list) {
            System.out.println(menu);
        }
        
        // 收集所有一級選單
        List<Menu> menuList = getRootMenu(list);
        
        // 為一級選單設定子選單
        for (Menu menu : menuList) {
            menu.setChildMenus(getChild(menu.getId(), list));
        }
        
        System.out.println("---遞迴後---");
        for (Menu menu : menuList) {
            System.out.println(menu);
        }
        
    }
    
}

結果參考:

參考連結:https://blog.csdn.net/qq_41570658/article/details/89384977