主頁 > 後端開發 > JAVA非遞回生成無限級選單樹的較簡代碼實作。(非泛用型工具包,僅總結邏輯)

JAVA非遞回生成無限級選單樹的較簡代碼實作。(非泛用型工具包,僅總結邏輯)

2023-06-14 07:46:59 後端開發

這是一個根據串列生成一個樹狀結構的較簡單實作,搜了搜看起來好像沒多少人總結過這種實作,寫上來整理一下自己的思路,請大家用用看看,應該用起來問題不大?反正我沒遇到BUG,

實作的時間復雜度為O(N),空間復雜度應該還是O(N)吧,不過GPT說O(1)可能是因為java的物件實作hash鏈表是參考而不是新建一個新物件?

好的,首先表明這個方法實作的前提條件:

1:串列包含的物體類必須有id和pid(也就是父類ID)兩個屬性,另外,需要重寫物體類子類串列的get方法,當串列為空時候new一個串列,(這個其實也是為了防止空指標,嫌棄麻煩的可以在下面的構造中加入判斷空串列)

2其根節點必須是0或者某個特定的數字,(為空也行,但是你得在獲取自己的父節點時判斷pid是否為空,并且給他賦值一個永遠無法用到的值,這個鍵值對應的節點子節點串列即為所需的選單樹)

這些都不太影響實作的時間復雜度,只是為了處理例外情況的解決辦法,所以可以忽略,除了那個id和pid,不過講真,一個樹結構沒這兩個屬性也挺離譜的,

廢話少說,上代碼,

首先生成無限級分類樹的代碼,串列物體類與所需物體類不同也不是大問題,   

list<menuVo> nodeList = 獲得list的方法();
Hashmap<menuVO> hashMap =new Hashmap<>();
for(menuVO node : nodeList){
//添加自身節點,如果已經有自身節點代表之前遍歷過他的子類,把之前放入的子類拿出來賦給自己,再將自己放回表內,提供給后續子類使用, menuVO now = hashMap.get(node.getId()); if(now!=null){ node.setChildren(now.getChildren()); } //如果在這里過濾區分條件,無法確保節點存在,如果作為父類節點被子類創建,會存在一個沒有賦值的節點存在,且在接下來的查找父類時會將無值物件存放入父類子串列中, hashMap.put(node.getId(),node); //尋找自己的父類節點,沒有就代表父類結點未遍歷、自己創一個先用著,等到遍歷到父類節點時再由父類轉換子類物件, menuVO parent = hashMap.getOrDefault(node.getPid(),new menuVO()); //選擇條件放在這里,判斷是否需要加入node.
         if(選擇判斷陳述句){   
            parent.getChildren().add(node);//似乎這么塞也行,但是還得存放一下父類,因為如果hashmap里沒有映射,父類塞完之后沒有用,如果hashmap記憶體在父類,shikeyi直接影響父類物件,
                  hashMap.put(node.getPid(),parent);
          } }

 該實作具體的邏輯就是遍歷整個串列,在一個hashmap中一個結點只有兩個身份,一個是特定節點的子節點,一個是它自身節點,只要將這兩個身份實作,最后獲得的根節點,其下屬的子節點串列就是整個選單樹,不需要關心某個節點有多少子節點,只需要關心我是誰,需要放在hash表的哪里?我的父節點是誰,我需要把我放在他的子節點鏈表下,這樣可以不需要對節點進行排序,也能實作構造邏輯樹,如果有排序需求的話,,,最后的時候對其進行一下排序,不過這樣的話時間復雜度就上去了,(這里可能需要優化一下?不過賣點就是不排序直接生成啊,)

 

 以下是寫的操作串列的工具類,這個確實是可以拿來用的,不說時間復雜度了,反正應該是最簡了吧,除非再改一改資料結構

第一獲取節點

 private menuVO getByCode(List<menuVO> list, String code) {

        for (int i = 0; i < list.size(); i++) {
            menuVO vo = list.get(i);
            if (code.equals(vo.getCode())) {//看他自己是不是這個節點
                return vo;
            }
            vo = vo.getChildren().size() > 0 ? getByCode(vo.getChildren(), code) : null;
            if (vo != null) {
                return vo;
            }
        }
        return null;
    }

第二,洗掉特定節點

private Boolean removeByCode(List<menuVO> list, String code) {

        for (int i = 0; i < list.size(); i++) {
            menuVO vo = list.get(i);
            if (code.equals(vo.getCode())) {
                list.remove(i);
                return true;
            }
            if (vo.getChildren().size() > 0 ? removeByCode(vo.getChildren(), code) : false) {//沒子節點就不遞回了,
                return true;
            }
        }
        return false;
    }

第三增加節點.那不是跟洗掉差不多?穿參不一樣罷了,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555050.html

標籤:Java

上一篇:Java的泛型

下一篇:返回列表

標籤雲
其他(160896) Python(38222) JavaScript(25493) Java(18227) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7248) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5874) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4591) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2435) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1964) Web開發(1951) C++(1939) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • JAVA非遞回生成無限級選單樹的較簡代碼實作。(非泛用型工具包,僅總

    這是一個根據串列生成一個樹狀結構的較簡單實作。搜了搜看起來好像沒多少人總結過這種實作。寫上來整理一下自己的思路,請大家用用看看,應該用起來問題不大?反正我沒遇到BUG。 實作的時間復雜度為O(N),空間復雜度應該還是O(N)吧。不過GPT說O(1)可能是因為java的物件實作hash鏈表是參考而不是 ......

    uj5u.com 2023-06-14 07:46:59 more
  • Java的泛型

    泛型程式設計(Generic programming) 意味著撰寫的代碼可以被很多不同型別的物件所重用。泛型對于集合類尤其有用,例如,ArrayList 就是一個無處不在的集合類。一個 ArrayList 類可以聚集任何型別的物件,這是一個泛型程式設計的實體。 ......

    uj5u.com 2023-06-14 07:46:53 more
  • 【解決一個小問題】golang 的 `-race`選項導致 unsafe代碼 panic

    **作者:張富春(ahfuzhang),轉載時請注明作者和參考鏈接,謝謝!** * [cnblogs博客](https://www.cnblogs.com/ahfuzhang/) * [zhihu](https://www.zhihu.com/people/ahfuzhang/posts) * [G ......

    uj5u.com 2023-06-14 07:46:34 more
  • Go 語言之 sqlx 庫使用

    # Go 語言之 sqlx 庫使用 ## 一、sqlx 庫安裝與連接 ### sqlx 介紹 sqlx is a library which provides a set of extensions on go's standard `database/sql` library. The sqlx ......

    uj5u.com 2023-06-14 07:46:24 more
  • 深入探究for...range陳述句

    # 1. 引言 在Go語言中,我們經常需要對資料集合進行遍歷操作。對于陣列來說,使用for陳述句可以很方便地完成遍歷。然而,當我們面對其他資料型別,如map、string 和 channel 時,使用普通的for回圈無法直接完成遍歷。為了更加便捷地遍歷這些資料型別,Go語言引入了for...range ......

    uj5u.com 2023-06-14 07:46:18 more
  • vs2022 wxWidgets

    # 下載 https://www.wxwidgets.org/downloads/ 下載壓縮包即可 ![image](https://img2023.cnblogs.com/blog/916065/202306/916065-20230614040303993-2082032985.png) # 編 ......

    uj5u.com 2023-06-14 07:45:22 more
  • OpenFoam——自定義求解器

    ## 1、求解器 ### 1.1 復制原始碼 本案例以icoFoam為例,復制【openFOAM/OpenFOAM-9/applications/solvers/incompressible/icoFoam】檔案夾至run檔案夾下(我的是【openFOAM/mtl-9/run/solvers/inco ......

    uj5u.com 2023-06-14 07:44:36 more
  • C++面試八股文:什么是RAII?

    某日二師兄參加XXX科技公司的C++工程師開發崗位第13面: > 面試官:什么是`RAII`? > > 二師兄:`RAII`是`Resource Acquisition Is Initialization`的縮寫。翻譯成中文是資源獲取即初始化。 > > 面試官:`RAII`有什么特點和優勢? > > ......

    uj5u.com 2023-06-14 07:44:13 more
  • 現代C++學習指南-方向篇

    C++是一門有著四十年歷史的語言,先后經歷過四次版本大升級(誕生、98、11、17(20),14算小升級)。每次升級都是很多問題和解決方案的取舍。了解這些歷史,能更好地幫助我們理清語言的發展脈絡。所以接下來我將借它的發展歷程,談一談我對它的理解,最后給出我認為比較合理的學習路線指南。 ### C++ ......

    uj5u.com 2023-06-14 07:44:09 more
  • 現代C++學習指南-型別系統

    > 在前一篇,我們提供了一個方向性的指南,但是學什么,怎么學卻沒有詳細展開。本篇將在前文的基礎上,著重介紹下怎樣學習C++的型別系統。 ### 寫在前面 在進入型別系統之前,我們應該先達成一項共識——盡可能使用C++的現代語法。眾所周知,出于兼容性的考慮,C++中很多語法都是合法的。但是隨著新版本的 ......

    uj5u.com 2023-06-14 07:44:04 more