【Java用法】Hutool樹結構工具-TreeUtil快速構建樹形結構的兩種方式 + 數據排序

Hutool樹結構工具-TreeUtil快速構建樹形結構的兩種方式 + 數據排序

  • 一、業務場景
  • 二、Hutool官網樹結構工具
    • 2.1 介紹
    • 2.2 使用
      • 2.2.1 定義結構
      • 2.2.2 構建Tree
      • 2.2.3 自定義字段名
    • 2.3 說明
  • 三、具體的使用場景
    • 3.1 實現的效果
    • 3.2 業務代碼
    • 3.3 實現自定義字段的排序
  • 四、踩過的坑
    • 4.1 坑1:weight權重屬性 類型異常
    • 4.2 坑2:weight權重屬性 字符串只能根據首字母排序

一、業務場景

Springboot + vue 開發;

想實現樹結構業務,并在樹結構節點有業務功能,比如根據樹結構節點排序、節點的狀態顯示等功能。

在開發過程中,必定會遇到樹形結構的數據,一般都是后端直接從庫里查詢出來然后自定義方法去封裝成樹形樹形返回給前端。這里就會用到遞歸、封裝再返回,非常麻煩。后來發現 HutoolUtil 中有個工具類 TreeUtil 可以完成本次項目的需求,非常便捷,使用方式很簡單,本次就使用它來實現。

二、Hutool官網樹結構工具

如果想查詢Hutool官網最新的樹結構工具,請各位看官移步至傳送門:官網樹結構工具-TreeUtil。

以下是當時使用此 TreeUtil 時的官網介紹。

2.1 介紹

考慮到菜單等需求的普遍性,有用戶提交了一個擴展性極好的樹狀結構實現。這種樹狀結構可以根據配置文件靈活的定義節點之間的關系,也能很好的兼容關系數據庫中數據。實現 關系型數據庫數據 <-> Tree <-> JSON 樹狀結構中最大的問題就是關系問題,在數據庫中,每條數據通過某個字段關聯自己的父節點,每個業務中這個字段的名字都不同,如何解決這個問題呢?

PR的提供者提供了一種解決思路:自定義字段名,節點不再是一個bean,而是一個map,實現靈活的字段名定義。

2.2 使用

2.2.1 定義結構

我們假設要構建一個菜單,可以實現系統管理和店鋪管理,菜單的樣子如下:

系統管理
|- 用戶管理
|- 添加用戶
店鋪管理
|- 商品管理
|- 添加商品

那這種結構如何保存在數據庫中呢?一般是這樣的:

在這里插入圖片描述

2.2.2 構建Tree

// 構建node列表
List<TreeNode<String>> nodeList = CollUtil.newArrayList();nodeList.add(new TreeNode<>("1", "0", "系統管理", 5));
nodeList.add(new TreeNode<>("11", "1", "用戶管理", 222222));
nodeList.add(new TreeNode<>("111", "11", "用戶添加", 0));
nodeList.add(new TreeNode<>("2", "0", "店鋪管理", 1));
nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
nodeList.add(new TreeNode<>("221", "2", "商品管理2", 2));

TreeNode表示一個抽象的節點,也表示數據庫中一行數據。 如果有其它數據,可以調用setExtra添加擴展字段。

// 0表示最頂層的id是0
List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");

因為兩個Tree是平級的,再沒有上層節點,因此為List。

2.2.3 自定義字段名

//配置
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定義屬性名 都要默認值的
treeNodeConfig.setWeightKey("order");
treeNodeConfig.setIdKey("rid");
// 最大遞歸深度
treeNodeConfig.setDeep(3);//轉換器
List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0", treeNodeConfig,(treeNode, tree) -> {tree.setId(treeNode.getId());tree.setParentId(treeNode.getParentId());tree.setWeight(treeNode.getWeight());tree.setName(treeNode.getName());// 擴展屬性 ...tree.putExtra("extraField", 666);tree.putExtra("other", new Object());});

通過TreeNodeConfig我們可以自定義節點的名稱、關系節點id名稱,這樣就可以和不同的數據庫做對應。

2.3 說明

官網上描述的是最通用和最簡單的使用方法,但是在實際開發中,我們的業務場景都會比實際的復雜很多,所以結合業務場景實現此功能。

三、具體的使用場景

3.1 實現的效果

在這里插入圖片描述

3.2 業務代碼

在這里插入圖片描述

3.3 實現自定義字段的排序

使用官網推薦的方法排序

TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定義屬性名 都要默認值的
treeNodeConfig.setWeightKey("order");

然后在轉換器中取出此自定義的排序字段時,無論怎么配置和設置都是無法使用自定義的字段。

在網上搜索的自定義方法都是與官網上一樣,通過 TreeNodeConfig 配置類設置,然后在轉換器 treeNode 類中獲取。在我所使用的項目中始終不生效。所以只能靠自己解決了。

通過自己的摸索和研究,如3.2中的代碼通過拓展字段可以實現。

然后在轉換器中,通過拓展字段把自定義的排序字段取出然后再賦值給 Tree 類中的 weight 屬性即可。

四、踩過的坑

4.1 坑1:weight權重屬性 類型異常

官網中的weight權重屬性不能使用 int 類型的字段,項目啟動正常,調用接口時會報類型轉換異常錯誤。

4.2 坑2:weight權重屬性 字符串只能根據首字母排序

如果此字段設置為字符串類型的排序字段時,TreeUtil 只會根據首字母排序,限制了我們使用的情況,所以此種情況也不符合我們的期望。

本文完結!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208155.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208155.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208155.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

策略產品經理常用的ChatGPT通用提示詞模板

產品策略&#xff1a;請幫助我制定一個策略產品的產品策略。 市場調研&#xff1a;如何進行策略產品的市場調研&#xff1f; 競爭分析&#xff1a;如何進行策略產品的競爭分析&#xff1f; 用戶畫像&#xff1a;如何構建策略產品的用戶畫像&#xff1f; 產品定位&#xff1…

交換排序(冒泡排序)(快速排序(1))

目錄 1.交換排序 &#xff08;1&#xff09;冒泡排序 &#xff08;2&#xff09;快速排序 1.交換排序 基本思想&#xff1a;所謂交換&#xff0c;就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置&#xff0c;交換排序的特點是&#xff1a;將鍵值較大的…

ambari hive on Tez引擎一直卡住

hive on tez使用./bin/hive啟動后一直卡住&#xff0c;無法進入命令行 使用TEZ作為Hive默認執行引擎時&#xff0c;需要在調用Hive CLI的時候啟動YARN應用&#xff0c;預分配資源&#xff0c;這需要花一些時間&#xff0c;而使用MapReduce作為執行引擎時是在執行語句的時候才會…

iPaaS架構深入探討

在數字化時代全面來臨之際&#xff0c;企業正面臨著前所未有的挑戰與機遇。技術的迅猛發展與數字化轉型正在徹底顛覆各行各業的格局&#xff0c;不斷推動著企業邁向新的前程。然而&#xff0c;這一數字化時代亦衍生出一系列復雜而深奧的難題&#xff1a;各異系統之間數據孤島、…

基于SuperMap iObjects Java生成地圖瓦片

作者&#xff1a;dongyx 前言 在GIS領域&#xff0c;地圖瓦片技術作為GIS領域的關鍵技術&#xff0c;是提高地圖服務性能的關鍵手段之一。通過預先生成地圖的瓦片數據&#xff0c;可以顯著提升用戶訪問地圖時的響應速度和體驗。SuperMap iObjects for Java作為一款強大的GIS開…

Docker, Docker-compose部署Sonarqube

參考文檔 鏡像地址: https://hub.docker.com/_/sonarqube/tags Docker部署文檔地址 Installing from Docker | SonarQube Docs Docker-compose文檔部署地址&#xff1a; Installing from Docker | SonarQube Docs 部署鏡像 2.1 docker部署 # 宿主機執行 $. vi /etc/sysctl.conf…

Java注解詳解

概述 注解是對程序代碼進行標注和解釋的一種方式。在Java中&#xff0c;注解提供了一種元數據形式&#xff0c;能夠在程序中嵌入有關程序的信息&#xff0c;以便進行進一步的處理。注解通過使用符號來聲明&#xff0c;如Override、Deprecated等。 注解和注釋的區別 注釋&…

Unity中Batching優化的GPU實例化(4)

文章目錄 前言一、構建需要實例化的額外數據二、在頂點著色器&#xff0c;將實例化 ID 從 appdata 存入 v2f 傳給片元著色器三、在片斷著色器中訪問具體的實例化變量三、使用代碼修改Shader材質屬性&#xff0c;實現GPU實例化后不同對象顏色不同的效果1、在C#測試腳本生成小板凳…

ReactJs筆記摘錄

前言 以前2018年搞過一段時間react antd開發&#xff0c;兜兜轉轉又回到react世界。 TODO中 Hook函數 JSX語法 根元素與斜杠 注意局部的jsx片段也要加根元素: return (<div>{items.map((item) > (// 此處只能有一個根元素!!!<>...<div className&quo…

要求CHATGPT高質量回答的藝術:提示工程技術的完整指南—第 23 章:命名實體識別提示

要求CHATGPT高質量回答的藝術&#xff1a;提示工程技術的完整指南—第 23 章&#xff1a;命名實體識別提示 命名實體識別&#xff08;NER&#xff09;是一種允許模型對文本中的命名實體&#xff08;如人物、組織、地點和日期&#xff09;進行識別和分類的技術。 要在 ChatGPT…

微前端介紹

目錄 微前端概念 微前端特性 場景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 無界微前端 方案 無界方案 成本低 速度快 原生隔離 功能強大 總結 前言&#xff1a;微前端已經是一個非常成熟的領域了&#xff0c;但開發者不管采用哪個現…

Leetcode—290.單詞規律【簡單】

2023每日刷題&#xff08;五十一&#xff09; Leetcode—290.單詞規律 實現代碼 class Solution { public:bool wordPattern(string pattern, string s) {unordered_map<char, string> m1;unordered_map<string, char> m2;stringstream stro(s);string tmp;for(a…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

應公司需求&#xff0c;在特定情況下需要修改ip 在開發過程中出現的小插曲 1、第一種情況&#xff1a;重復聲明 2、第二種情況&#xff1a; 應官方要求&#xff0c;需要跳轉的 tabBar 頁面的路徑&#xff08;需在 pages.json 的 tabBar 字段定義的頁面&#xff09;&#xff0…

React中使用TypeScript代替prop-types

原文鏈接 公眾號-React中使用TypeScript代替prop-types 個人公眾號&#xff0c;嗚嗚嗚&#xff0c;求各位大佬們關注下&#xff0c;本人的公眾號主要寫React 跟NodeJs的 ?關于prop-types 對于部分的同學&#xff0c;不大了解為什么我們的代碼里面要用到prop-types這個庫&a…

ArkTS快速入門

一、概述 ArkTS是鴻蒙生態的應用開發語言。它在保持TypeScript&#xff08;簡稱TS&#xff09;基本語法風格的基礎上&#xff0c;對TS的動態類型特性施加更嚴格的約束&#xff0c;引入靜態類型。同時&#xff0c;提供了聲明式UI、狀態管理等相應的能力&#xff0c;讓開發者可以…

深度學習基礎回顧

深度學習基礎 淺層網絡 VS 深層網絡深度學習常用的激活函數Sigmoid 函數ReLU 函數Softplus 函數tanh函數 歸納偏置CNN適用數據歸納偏置 RNN適用數據歸納偏置 淺層網絡 VS 深層網絡 淺層神經網絡參數過多&#xff0c;導致模型的復雜度和計算量很高&#xff0c;難以訓練。而深層…

Redisson的基礎使用(2)

布隆過濾器&#xff08;Bloom Filter&#xff09; 布隆過濾器一般用于解決緩存穿透的問題。主要原理是使用一組哈希函數&#xff0c;將元素映射成一組位數組中的索引位置。如果要檢查某個元素是否在集合中時&#xff0c;將此元素通過所有的哈希函數&#xff0c;查看哈希值對應的…

硬件開發筆記(十五):RK3568底板電路VGA顯示接口原理圖分析

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 紅胖子網絡科技博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬…

多態和繼承復習

與其明天開始&#xff0c;不如現在行動&#xff01; 文章目錄 多態多態成立的條件細節 繼承&#x1f48e;總結 多態 多態成立的條件 存在繼承關系或者實現關系子類重寫父類的方法父類引用指向子類對象 細節 通過父類的引用調用子類的對象 Animal animal new Dog();animal…

C語言搭建項目-學生管理系統(非鏈表)

、 目錄 搭建offer.h文件 搭建offer.c中的main函數 密碼登入系統 搭建my_oferr.c中的接口函數 使用幫助菜單接口函數 增加學生信息接口函數 查詢學生信息接口函數 刪除學生信息接口函數 保存學生信息接口 打開文件fopen 關閉文件fclose 判斷是否保存文件fwrite 退出執行文件…