色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

java TreeUtil菜單遞歸工具類

瀏覽:2日期:2022-08-26 09:22:43

本文實(shí)例為大家分享了java TreeUtil菜單遞歸工具類的具體代碼,供大家參考,具體內(nèi)容如下

菜單樹(詳細(xì))

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; }}

上面這種遞歸,如果遇到大數(shù)據(jù)量,效率是極低的。比如前段時(shí)間剛實(shí)現(xiàn)了省市區(qū)鎮(zhèn)四層的樹結(jié)構(gòu),面對5萬條的數(shù)據(jù),竟然120s才遞歸完,這也太慢了,將來需求變成了省市區(qū)鎮(zhèn)鄉(xiāng)五層的結(jié)構(gòu),那不就掛了?

大眼一看,不是跟上面的一樣嘛。仔細(xì)看 it.remove();

假設(shè)有五萬的數(shù)據(jù),根節(jié)點(diǎn)1萬,二級節(jié)點(diǎn)1萬,三級節(jié)點(diǎn)1萬,4級節(jié)點(diǎn)2萬。如果按照上面的邏輯走,每次都要從5萬中數(shù)據(jù)遞歸查找;而下面的邏輯是找到N級節(jié)點(diǎn)并且在總list中刪除。假設(shè)找到根節(jié)點(diǎn)的1萬數(shù)據(jù),并且把他們從總list中刪除,總list剩4萬條數(shù)據(jù),依次這樣,到了找4級節(jié)點(diǎn)時(shí),總list就已經(jīng)剩2萬條數(shù)據(jù)了,總數(shù)據(jù)量從5萬變成了2萬,循環(huán)次數(shù)就少了,效率也就高了

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 { /** * 創(chuàng)建樹結(jié)構(gòu) * @param regionTrees * @return */ private List<RegionTree> tree(List<RegionTree> regionTrees) { //返回的節(jié)點(diǎn)樹 List<RegionTree> rootNodes = new ArrayList<>(); Iterator<RegionTree> it = regionTrees.iterator(); while (it.hasNext()) { RegionTree next = it.next(); //parent(上級Id)為0的是根節(jié)點(diǎn) if ('0'.equals(next.getParentId())) { rootNodes.add(next); it.remove(); } } //遍歷,找到二級節(jié)點(diǎn) for (RegionTree regionTree : rootNodes) { List<RegionTree> child = getChild(regionTrees, regionTree.getId().toString()); regionTree.setChildren(child); } return rootNodes; } /** * 查子節(jié)點(diǎn) * * @param regions * @param parentId * @return */ private List<RegionTree> getChild(List<RegionTree> regions, String parentId) { //子節(jié)點(diǎn)列表 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(); } } //遍歷 遞歸獲取子節(jié)點(diǎn)的子節(jié)點(diǎn) 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; }}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 三区在线视频 | 国产精彩视频在线 | 亚洲欧美日韩精品永久在线 | 欧美aaaaa一级毛片在线 | 99久久免费国产精品 | 国内真实愉拍系列情侣 | 久久狠狠躁免费观看2020 | 午夜影院在线免费 | 国产性自拍 | 午夜免费片在线观看不卡 | 欧美激情久久久久久久大片 | 免费精品一区二区三区在线观看 | 日本一区二区三区国产 | 精品久久久中文字幕二区 | 黑人一级大毛片 | 男吃女下面刺激视频免费 | 黑人特黄aa毛片 | 国产成人a在一区线观看高清 | 国内精品自产拍在线观看91 | 爱呦视频在线播放网址 | 三级视频在线 | 九九视频在线观看视频23 | 99视频在线观看免费 | 久久精品18| 美女黄色毛片免费看 | 国产成人深夜福利短视频99 | 中文字幕在线看片成人 | 久久夜色精品国产噜噜亚洲a | 欧美成人手机视频 | 欧美一区二区三区在线 | 国产成人精品自拍 | 久久一日本道色综合久久 | 国产精品美女久久久久网站 | 国产一区二区三区在线观看影院 | 免费亚洲成人 | 亚洲三级在线视频 | 亚洲国产成人久久99精品 | 亚洲 欧美 精品 | 亚洲成人在线播放 | 国产一区二区三区亚洲欧美 | 久久这里只有精品视频99 |