菜單樹(遞歸遍歷)


          下面遞歸樹菜單效率低:

package com.admin.manager.storeService.util;

import com.admin.manager.storeService.entity.Menu;

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

/**
* @author m
* @date 2019/12/16
*/
public class TreeUtil {

/**
* 獲取菜單樹
* @param menus 所有菜單
* @return
*/
public static List<Menu> menuTree(List<Menu> menus) {
//返回的菜單樹
List<Menu> rootMenus = new ArrayList<>();
for (Menu menu : menus) {
//pid(上級Id)為0的是根菜單
if ("0".equals(menu.getPid())) {
rootMenus.add(menu);
}
}
//遍歷,找到二級菜單(根菜單的id和所有菜單中的pid比較)
for (Menu rootMenu : rootMenus) {
List<Menu> child = getChild(String.valueOf(rootMenu.getId()), menus);
rootMenu.setChildren(child);
}
return rootMenus;
}

/**
* 遞歸獲取下級菜單
* @param pid 上級Id
* @param menus 所有菜單
* @return
*/
public static List<Menu> getChild(String pid, List<Menu> menus) {
//子菜單列表
List<Menu> childList = new ArrayList<>();
for (Menu menu : menus) {
if (pid.equals(menu.getPid())) {
childList.add(menu);
}
}
//遍歷 遞歸獲取子菜單的子菜單
for (Menu menu : childList) {
List<Menu> child = getChild(String.valueOf(menu.getId()), menus);
menu.setChildren(child);
}
//遞歸出口 childList長度為0
if (childList.size() == 0) {
return new ArrayList<>();
}
return childList;
}
}

這個效率高點:

import com.energy.service.vo.RegionTree;

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

/**
* @author m
* @date 2020/4/2
*/
public class TreeUtil {
/**
* 創建樹結構
* @param regionTrees
* @return
*/
private List<RegionTree> tree(List<RegionTree> regionTrees) {
//返回的節點樹
List<RegionTree> rootNodes = new ArrayList<>();
Iterator<RegionTree> it = regionTrees.iterator();
while (it.hasNext()) {
RegionTree next = it.next();
//parent(上級Id)為0的是根節點
if ("0".equals(next.getParentId())) {
rootNodes.add(next);
it.remove();
}
}
//遍歷,找到二級節點
for (RegionTree regionTree : rootNodes) {
List<RegionTree> child = getChild(regionTrees, regionTree.getId().toString());
regionTree.setChildren(child);
}
return rootNodes;

}

/**
* 查子節點
*
* @param regions
* @param parentId
* @return
*/
private List<RegionTree> getChild(List<RegionTree> regions, String parentId) {

//子節點列表
List<RegionTree> childList = new ArrayList<>();
Iterator<RegionTree> it = regions.iterator();
while (it.hasNext()) {
RegionTree regionTree = it.next();
if (parentId.equals(regionTree.getParentId())) {
childList.add(regionTree);
it.remove();
}
}

//遍歷 遞歸獲取子節點的子節點
for (RegionTree regionTree : childList) {
List<RegionTree> child = getChild(regions, regionTree.getId().toString());
regionTree.setChildren(child);
}
//遞歸出口 childList長度為0
if (childList.size() == 0) {
return new ArrayList<>();
}
return childList;
}
}

 


免責聲明!

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



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