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

java TreeUtil菜單遞歸工具類

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

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

菜單樹(詳細)

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

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

假設(shè)有五萬的數(shù)據(jù),根節(jié)點1萬,二級節(jié)點1萬,三級節(jié)點1萬,4級節(jié)點2萬。如果按照上面的邏輯走,每次都要從5萬中數(shù)據(jù)遞歸查找;而下面的邏輯是找到N級節(jié)點并且在總list中刪除。假設(shè)找到根節(jié)點的1萬數(shù)據(jù),并且把他們從總list中刪除,總list剩4萬條數(shù)據(jù),依次這樣,到了找4級節(jié)點時,總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é)點樹
 List<RegionTree> rootNodes = new ArrayList<>();
 Iterator<RegionTree> it = regionTrees.iterator();
 while (it.hasNext()) {
  RegionTree next = it.next();
  //parent(上級Id)為0的是根節(jié)點
  if ("0".equals(next.getParentId())) {
  rootNodes.add(next);
  it.remove();
  }
 }
 //遍歷,找到二級節(jié)點
 for (RegionTree regionTree : rootNodes) {
  List<RegionTree> child = getChild(regionTrees, regionTree.getId().toString());
  regionTree.setChildren(child);
 }
 return rootNodes;

 }

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

 //子節(jié)點列表
 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é)點的子節(jié)點
 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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

    maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報錯問題

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

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

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

    Java?CopyOnWriteArrayList源碼超詳細分析

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

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

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

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

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

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

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

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

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

    java模式匹配之蠻力匹配

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

最新評論

井研县| 南郑县| 佛教| 陆丰市| 布尔津县| 来凤县| 仁寿县| 平昌县| 花莲县| 灵丘县| 迁安市| 景洪市| 大邑县| 上虞市| 阿坝县| 和平区| 正蓝旗| 眉山市| 来安县| 大关县| 泸州市| 星子县| 吴堡县| 廊坊市| 历史| 安泽县| 福鼎市| 分宜县| 兰州市| 蚌埠市| 桂阳县| 无极县| 眉山市| 广元市| 七台河市| 确山县| 栖霞市| 安宁市| 钟山县| 卢湾区| 荆州市|