最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java TreeUtil菜單遞歸工具類

 更新時(shí)間:2020年08月26日 16:50:21   作者:男人要霸氣  
這篇文章主要為大家詳細(xì)介紹了java TreeUtil菜單遞歸工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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(上級(jí)Id)為0的是根菜單
  if ("0".equals(menu.getPid())) {
  rootMenus.add(menu);
  }
 }
 //遍歷,找到二級(jí)菜單(根菜單的id和所有菜單中的pid比較)
 for (Menu rootMenu : rootMenus) {
  List<Menu> child = getChild(String.valueOf(rootMenu.getId()), menus);
  rootMenu.setChildren(child);
 }
 return rootMenus;
 }


 /**
 * 遞歸獲取下級(jí)菜單
 * @param pid 上級(jí)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),面對(duì)5萬條的數(shù)據(jù),竟然120s才遞歸完,這也太慢了,將來需求變成了省市區(qū)鎮(zhèn)鄉(xiāng)五層的結(jié)構(gòu),那不就掛了?

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

假設(shè)有五萬的數(shù)據(jù),根節(jié)點(diǎn)1萬,二級(jí)節(jié)點(diǎn)1萬,三級(jí)節(jié)點(diǎn)1萬,4級(jí)節(jié)點(diǎn)2萬。如果按照上面的邏輯走,每次都要從5萬中數(shù)據(jù)遞歸查找;而下面的邏輯是找到N級(jí)節(jié)點(diǎn)并且在總list中刪除。假設(shè)找到根節(jié)點(diǎn)的1萬數(shù)據(jù),并且把他們從總list中刪除,總list剩4萬條數(shù)據(jù),依次這樣,到了找4級(jí)節(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(上級(jí)Id)為0的是根節(jié)點(diǎn)
  if ("0".equals(next.getParentId())) {
  rootNodes.add(next);
  it.remove();
  }
 }
 //遍歷,找到二級(jí)節(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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中的轉(zhuǎn)義字符介紹

    java中的轉(zhuǎn)義字符介紹

    普通的轉(zhuǎn)義字符序列和八進(jìn)制轉(zhuǎn)義字符都比Unicode轉(zhuǎn)義字符要好得多,因?yàn)榕cUnicode轉(zhuǎn)義字符不同,轉(zhuǎn)義字符序列是在程序被解析為各種符號(hào)之后被處理的
    2013-09-09
  • m1 Mac設(shè)置多jdk版本并動(dòng)態(tài)切換的實(shí)現(xiàn)

    m1 Mac設(shè)置多jdk版本并動(dòng)態(tài)切換的實(shí)現(xiàn)

    本文主要介紹 Mac 下如何安裝 JDK 并且多版本如何切換,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報(bào)錯(cuò)問題

    maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報(bào)錯(cuò)問題

    本地倉庫是遠(yuǎn)程倉庫的一個(gè)緩沖和子集,當(dāng)你構(gòu)建Maven項(xiàng)目時(shí)首先會(huì)從本地倉庫查找資源,如果沒有那么Maven會(huì)從遠(yuǎn)程倉庫下載到你本地倉庫,這篇文章主要給大家介紹了關(guān)于maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報(bào)錯(cuò)問題的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Spring Data Jpa多表查詢返回自定義實(shí)體方式

    Spring Data Jpa多表查詢返回自定義實(shí)體方式

    這篇文章主要介紹了Spring Data Jpa多表查詢返回自定義實(shí)體方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java?CopyOnWriteArrayList源碼超詳細(xì)分析

    Java?CopyOnWriteArrayList源碼超詳細(xì)分析

    為了將讀取的性能發(fā)揮到極致,jdk中提供了CopyOnWriteArrayList類,下面這篇文章主要給大家介紹了關(guān)于java中CopyOnWriteArrayList源碼解析的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Java基礎(chǔ)教程之基本類型數(shù)據(jù)類型、包裝類及自動(dòng)拆裝箱

    Java基礎(chǔ)教程之基本類型數(shù)據(jù)類型、包裝類及自動(dòng)拆裝箱

    這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之基本類型數(shù)據(jù)類型、包裝類及自動(dòng)拆裝箱的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 使用Java注解和反射實(shí)現(xiàn)JSON字段自動(dòng)重命名

    使用Java注解和反射實(shí)現(xiàn)JSON字段自動(dòng)重命名

    這篇文章主要介紹了如何使用Java注解和反射實(shí)現(xiàn)JSON字段自動(dòng)重命名,文中通過代碼示例和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • Java設(shè)計(jì)模式之適配器模式的實(shí)現(xiàn)

    Java設(shè)計(jì)模式之適配器模式的實(shí)現(xiàn)

    這篇文章主要介紹了Java設(shè)計(jì)模式之適配器模式的實(shí)現(xiàn),適配器模式(Adapter Pattern)是作為兩個(gè)不兼容的接口之間的橋梁,這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它結(jié)合了兩個(gè)獨(dú)立接口的功能,需要的朋友可以參考下
    2023-11-11
  • IDEA導(dǎo)入jar包的完整實(shí)現(xiàn)步驟

    IDEA導(dǎo)入jar包的完整實(shí)現(xiàn)步驟

    由于導(dǎo)入jar包項(xiàng)目存在很多不確定的問題,導(dǎo)致每次都需要調(diào)試、配置好多遍,對(duì)此特意記錄下來,這篇文章主要給大家介紹了關(guān)于IDEA導(dǎo)入jar包的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • java模式匹配之蠻力匹配

    java模式匹配之蠻力匹配

    這篇文章主要介紹了java模式匹配之蠻力匹配的相關(guān)資料和代碼,需要的朋友可以參考下
    2015-05-05

最新評(píng)論

衡水市| 铜鼓县| 普兰店市| 巴里| 东山县| 顺平县| 通海县| 象州县| 瑞丽市| 丰城市| 灵台县| 疏勒县| 佛山市| 历史| 太保市| 射洪县| 定西市| 莆田市| 垫江县| 固阳县| 光山县| 双桥区| 芦山县| 什邡市| 前郭尔| 北川| 新津县| 廉江市| 丰台区| 石河子市| 方城县| 万年县| 建德市| 阿克| 东至县| 朝阳市| 六枝特区| 府谷县| 象山县| 长沙县| 共和县|