java遞歸展示樹形圖代碼實現以及遇到的問題

来源:https://www.cnblogs.com/zhanvo/archive/2019/05/15/10872656.html
-Advertisement-
Play Games

我最近寫到了一個項目中用到了樹形圖,不得不說這個樹形圖是真的扯淡; 我用到的是layui中的樹形圖,再展示數據過程中遇到了很多的問題,廢話不多說,直接貼代碼。 一、調用排序介面,對數據進行排序。 二、生成樹結構 ...


我最近寫到了一個項目中用到了樹形圖,不得不說這個樹形圖是真的扯淡;

我用到的是layui中的樹形圖,再展示數據過程中遇到了很多的問題,廢話不多說,直接貼代碼。

一、調用排序介面,對數據進行排序。

二、生成樹結構

public static List<TreeVo> findTree(List<WfUnit> allMenu){  //這裡TreeVo是我寫了一個跟layui樹形圖結構一樣結構的實體類,WfUnit是我資料庫表的實體類。

//查詢所有菜單
//根節點
try {
List<TreeVo> tree = new ArrayList<>();
for (WfUnit nav : allMenu) {
System.out.println(nav.getOwnerunitid());
if (nav.getOwnerunitid().equals("0")) {//父節點是0的,為根節點,這裡getOwnerunitid是我關聯id自連接。
TreeVo t = new TreeVo();
t.setId(nav.getUnitid());
t.setName(nav.getUnitname());
t.setLevel(nav.getUnitlevel());
t.setOwnerunitid(nav.getOwnerunitid());
t.setSequence(nav.getUnitsequence());
tree.add(t);
}
}
/* 根據實體類的樹等級排序 */
Collections.sort(tree, Level());
//為根菜單設置子菜單,getClild是遞歸調用的
for (TreeVo nav : tree) {
/* 獲取根節點下的所有子節點 使用getChild方法*/
List<TreeVo> childList = getChild(nav.getId(), allMenu);
System.out.println(childList);
nav.setChildren(childList);//給根節點設置子節點
}
return tree;
} catch (Exception e) {
return null;
}
}


三、遍歷子樹
/**
* 獲取子節點
* @param id 父節點id
* @param allMenu 所有菜單列表
* @return 每個根節點下,所有子菜單列表
*/
public static List<TreeVo> getChild(String id,List<WfUnit> allMenu){
if(allMenu.size() == 0){ //這裡用來結束迴圈,一開始我用的for迴圈,發現會進入死迴圈,然後換成了迭代器。
return null;
}
//子菜單
List<TreeVo> childList = new ArrayList<TreeVo>();
Iterator<WfUnit> it = allMenu.iterator();
while(it.hasNext()){
WfUnit s = it.next();
if(s.getOwnerunitid().equals(id)){
//1.迭代就是迭代,不要對集合進行修改
childList.add(new TreeVo(s.getUnitid(),s.getUnitname(),s.getUnitlevel(),s.getOwnerunitid(),s.getUnitsequence()));
it.remove();
}
}
ListIterator<TreeVo> listIt = childList.listIterator();
System.out.println(childList);
while(listIt.hasNext()){
TreeVo s = listIt.next();
s.setChildren(getChild(s.getId(), allMenu));
Collections.sort(childList,Level());//排序
//如果節點下沒有子節點,返回一個空List(遞歸退出)
if(childList.size() == 0){
return new ArrayList<TreeVo>();
}
System.out.println(s);
}
System.out.println(childList);
return childList;
}
最後給大家總結一下,這個排序有個問題,就是你的根節點不能只有一個數據,你們可以加個if判斷試一下看行不行。
只有一個數據的話排序會拋異常,因為趕需求我也沒更仔細的看。還有就是你的排序欄位給的值千萬別重覆!!!
如果你的問題還是解決不了,可以私聊我。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、unittest模塊官方文檔: https://docs.python.org/3/library/unittest.html 二、一張圖看懂unittest: 三、Unittest主要方法屬性: 1.unittest.TestCase:TestCase類,所有測試用例繼承的基本類: class ...
  • // 導包 import java.util.Scanner; public class Sort { public static void main(String[] args) { // 創建鍵盤輸入對象 Scanner sc = new Scanner(System.out.println); ...
  • 1. 可能是開始也可能是結束 RadonDB是國內知名雲服務提供商青雲開源的一款產品,下麵是一段來自官方的介紹: QingCloud RadonDB 是基於 MySQL 研發的新一代分散式關係型資料庫,可無限水平擴展,支持分散式事務,具備金融級數據強一致性,滿足企業級核心資料庫對大容量、高併發、高可 ...
  • #include <conio.h>int getch(void);// 從控制台得到下一個字元,以ASCII值返回,並不在屏幕顯示該字元int getche(void);// 從控制台得到下一個字元,以ASCII值返回int kbhit(void);// 判斷控制台是否仍有未輸入的字元。若有,則返 ...
  • 在OOP(面向對象)語言中,最重要的一個概念就是:萬事萬物皆對象。 在java中,類也是一個對象,是java.lang.Class的實例對象,官網稱該對象為類的類類型。 Class 類的實例表示正在運行的 Java 應用程式中的類和介面。基本的 Java 類型(boolean、byte、char、s ...
  • 力扣題目解答自我總結(二) 一.迴文數 1.題目描述 判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 示例 1: 示例 2: 示例 3: 2.解答 二.寶石和石頭 1.題目描述 給定字元串 代表石頭中寶石的類型,和字元串 代表你擁有的石頭。 中每個字元代表了 ...
  • 加Q[965546358]獲取資源 第1章 課程導學 第2章 小程式開發入門 從幾個方面介紹小程式開發相關的內容,包括小程式開發者賬號註冊、小程式開發流程、小程式開發規範、小程式常用的API,例如網路請求、本地緩存等API,以及小程式組件等等的知識點。 第3章 深入Django視圖層 分層次介紹Dj ...
  • 樹 概念:樹是一些節點的集合,一棵樹由稱作根(root)的節點 r 以及0個或多個非空的(子)樹組成,這些子樹中每一棵的根都被來自根 r 的一條有向的邊(edge)連接。每一棵子樹的根叫做根 r 的兒子(child),r 是每一棵子樹的根的父親(parent)。一棵樹是N個 節點和N-1條邊的集合, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...