樹形結構的一種便捷實現方案

背景

在開發過程中經常需要把平鋪的數據結構轉為樹形的數據結構,例如多級菜單、組織機構等。

實現方案有很多種。

1、可以使用遞歸查詢,但是這樣數據一多會導致頻繁的多次查詢數據庫,產生很多額外的IO開銷,總體的響應時間會比較慢,一般不會這樣做。

2、可以事先查詢出來所有的數據,再進行遞歸的子節點查找,這是一個可行的方案,只需要查詢一次數據庫,之后的操作利用算法在內存操作,這樣響應時間會有一個很大的提升。

3、這里要說的一種方案和第二種類似,只不過采用了google的guava包下的Multimap這種數據結構,利用它可以一個key對應多個值的特性。

方案實現

引入guava包

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.2.0-jre</version>
</dependency><!-- 這個包可以不要,這里我用來轉json字符串打印出來有用到 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency>

樹形VO

@Data
public class TreeVO {private List<TreeVO> children;private int id;private boolean leaf;private String menuName;private int parentId;
}

轉樹示例代碼

public static void main(String[] args) {TreeVO v1 = new TreeVO();v1.setId(10L);v1.setParentId(0L);v1.setMenuName("第一級菜單");TreeVO  v2 = new TreeVO();v2.setId(11L);v2.setParentId(10L);v2.setMenuName("第二級菜單1");TreeVO v21 = new TreeVO();v21.setId(12L);v21.setParentId(10L);v21.setMenuName("第二級菜單2");TreeVO v3 = new TreeVO();v3.setId(21L);v3.setParentId(11L);v3.setMenuName("第三級菜單");Multimap<Long,TreeVO> multimap = ArrayListMultimap.create();multimap.put(v1.getParentId(),v1);multimap.put(v2.getParentId(),v2);multimap.put(v21.getParentId(),v21);multimap.put(v3.getParentId(),v3);Iterator<TreeVO> iterator = multimap.values().iterator();while (iterator.hasNext()) {TreeVOmenuNode = iterator.next();// 找直接后代 childrenCollection<TreeVO> children = multimap.get(menuNode.getId());if (children.isEmpty()) {menuNode.setLeaf(true);menuNode.setChildren(null);} else {menuNode.setChildren(children);}}System.out.println(JSON.toJSONString(multimap.get(0L),SerializerFeature.PrettyFormat));}

這里打印出來的結果是

[
?? ?{
?? ??? ?"children":[
?? ??? ??? ?{
?? ??? ??? ??? ?"children":[
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?"id":21,
?? ??? ??? ??? ??? ??? ?"leaf":true,
?? ??? ??? ??? ??? ??? ?"menuName":"第三級菜單",
?? ??? ??? ??? ??? ??? ?"parentId":11
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?],
?? ??? ??? ??? ?"id":11,
?? ??? ??? ??? ?"leaf":false,
?? ??? ??? ??? ?"menuName":"第二級菜單1",
?? ??? ??? ??? ?"parentId":10
?? ??? ??? ?},
?? ??? ??? ?{
?? ??? ??? ??? ?"id":12,
?? ??? ??? ??? ?"leaf":true,
?? ??? ??? ??? ?"menuName":"第二級菜單2",
?? ??? ??? ??? ?"parentId":10
?? ??? ??? ?}
?? ??? ?],
?? ??? ?"id":10,
?? ??? ?"leaf":false,
?? ??? ?"menuName":"第一級菜單",
?? ??? ?"parentId":0
?? ?}
]

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

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

相關文章

【uniapp微信小程序】uniapp微信小程序——頁面通信

uniapp微信小程序——頁面通信 在開發微信小程序過程中&#xff0c;頁面之間的通信是一個常見需求。在使用 uniapp 開發微信小程序時&#xff0c;我們可以采用多種方式實現頁面之間的數據傳遞和狀態共享。本文將詳細介紹幾種常見的實現方式&#xff0c;以供開發者參考。 1. 頁…

谷歌內置AI部署

感謝閱讀 準備工作開啟功能查看下載情況安裝插件效果截圖網頁版地址&#xff08;需進行前面的所有步驟&#xff09; 準備工作 點我下載谷歌dev版本 注意這個版本不需要卸載之前版本 開啟功能 使用下載的瀏覽器依次導航到下面兩個地方&#xff0c;然后點擊enablebypass以及en…

自動優化:SQL Server數據庫自動收縮配置指南

自動優化&#xff1a;SQL Server數據庫自動收縮配置指南 在數據庫管理中&#xff0c;隨著數據的增刪&#xff0c;數據庫文件的大小會不斷變化&#xff0c;導致空間浪費和性能下降。SQL Server提供了自動收縮功能&#xff0c;幫助數據庫文件保持最佳狀態。本文將深入探討如何在…

2025最新付費進群系統源碼 修復版

2025最新付費進群系統 修復一堆bug 修復分銷無法添加 易支付只能在文件里更改等等問題 源碼下載&#xff1a;https://download.csdn.net/download/m0_66047725/89515782 更多資源下載&#xff1a;關注我。

【結構型模式-代理模式】

概述 由于某些原因需要給某對象提供一個代理以控制該對象的訪問。這時&#xff0c;訪問對象不適合或者不能直接引用目標對象&#xff0c;代理對象作為訪問對象與目標對象之間的中介。 Java中的代理按照代理類生成時機不同又分為靜態代理和動態代理。靜態代理代理類在編譯期就生…

情感分析新紀元:Transformer模型的革命性應用

情感分析新紀元&#xff1a;Transformer模型的革命性應用 情感分析&#xff0c;又稱為意見挖掘&#xff0c;是自然語言處理&#xff08;NLP&#xff09;領域中的一項重要任務&#xff0c;它旨在從文本數據中識別和提取主觀信息&#xff0c;判斷文本所表達的情感傾向&#xff0…

MACOS查看硬盤讀寫量

一、安裝Homebrew 按照提示進行安裝 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"二、安裝smartmontools brew install smartmontools三、查看硬盤讀寫量等信息 sudo smartctl -a /dev/disk0

WPF 制作一個文字漂浮提示框

WPF好像沒有自帶的文字提示漂浮&#xff0c;我們可以定制一個。 效果如下&#xff1a; xaml xaml如下&#xff1a; <Window x:Class"GroupServer.MsgTip"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://sc…

谷粒商城學習筆記-23-分布式組件-SpringCloud Alibaba-Nacos配置中心-簡單示例

之前已經學習了使用Nacos作為注冊中心&#xff0c;這一節學習Nacos另外一個核心功能&#xff1a;配置中心。 一&#xff0c;Nacos配置中心簡介 Nacos是一個易于使用的平臺&#xff0c;用于動態服務發現和配置管理。作為配置中心&#xff0c;Nacos提供了以下核心功能和優勢&am…

微軟推出全新的學習網站 Microsoft Learn

微軟官方宣布推出全新的學習網站 Microsoft Learn&#xff0c;供開發人員學習 Microsoft 技術。 該網站包含所有 Microsoft 產品和服務(從 HoloLens 到 Azure)的技術文檔。提供了超過 80 小時的學習內容&#xff0c;涉及 Azure、Dynamics 365、PowerApps、Microsoft Flow 和 Po…

VSTO插件功能介紹-清除空行【進化過程】

大家看到的是完成的成果&#xff0c; 可能不知在其中&#xff0c;寫碼人的艱辛 今天的主要是記錄【進化過程】 用于自勉&#xff0c;與大家共勉&#xff0c;努力 文章中的代碼你可復制使用哦 想要的效果若用戶選擇了區域&#xff0c;選擇確定Button對此區域&#xff0c;進行清除…

代碼隨想錄算法訓練營Day64|拓撲排序(卡碼網117)、dijkstra樸素版

拓撲排序 117. 軟件構建 (kamacoder.com) 拓撲排序簡單的說是將一個有向圖轉為線性的排序。 它將圖中的所有結點排序成一個線性序列&#xff0c;使得對于任何的邊uv&#xff0c;結點u在序列中都出現在結點v之前&#xff0c;這樣的序列滿足圖中所有的前驅-后繼關系。 拓撲排…

vue 插槽 【slot】

文章目錄 默認插槽具名插槽作用域插槽 默認插槽 父組件中&#xff1a;<Category title"今日熱門游戲"><ul><li v-for"g in games" :key"g.id">{{ g.name }}</li></ul></Category> 子組件中&#xff1a;<…

9. 機器人數目

題目描述 本題為填空題&#xff0c;只需要算出結果后&#xff0c;在代碼中使用輸出語句將所填結果輸出即可。 少年宮新近郵購了小機器人配件&#xff0c;共有3類。 &#x1d434;A 類含有&#xff1a;88 個輪子&#xff0c;11 個傳感器&#xff1b; &#x1d435;B 類含有:…

深入理解基本數據結構:棧詳解

引言 在計算機科學中&#xff0c;數據結構是存儲、組織和管理數據的方式。棧是一種重要的線性數據結構&#xff0c;廣泛應用于各種編程場景。在這篇博客中&#xff0c;我們將詳細探討棧的定義、特點、操作及其在不同編程語言中的實現。 什么是棧&#xff1f; **棧&#xff08…

java動態代理的使用和代碼示例

文章目錄 1. 簡介2. 代碼3. 參考鏈接 1. 簡介 代理類在程序運行時創建的代理方式被成為動態代理。在靜態代理中&#xff0c;代理類&#xff08;RenterProxy&#xff09;是自己已經定義好了的&#xff0c;在程序運行之前就已經編譯完成。而動態代理是在運行時根據我們在Java代碼…

前端vue 實現取色板 的選擇

大概就是這樣的 一般的web端框架 都有自帶的 的 比如 ant-design t-design 等 前端框架 都是帶有這個的 如果遇到沒有的我們可以自己嘗試開發一下 簡單 的 肯定比不上人家的 但是能用 能看 說的過去 我直接上代碼了 其實這個取色板 就是一個input type 是color 的input …

CTF學習記錄(一)——Web基礎

目錄 Web基礎Web基礎常用工具ncat(網絡工具中的瑞士軍刀&#xff0c;功能齊全)curl(一個工作在命令行的發起HTTP請求的工具)BurpSuite(Web核心抓包工具)Hackbar插件SwitchyOmega 代理插件&#xff08;非常牛逼&#xff09;Wappalyzer 技術判斷插件EditThisCookie 插件Postman 接…

深入理解Spring Boot中的定時任務調度

深入理解Spring Boot中的定時任務調度 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. Spring Boot中的定時任務概述 在現代應用程序開發中&#xff0c;定時任務調度是一項非常常見和重要的功能…

【計算機網絡03】不花錢怎么搭建一個網絡實驗室

使用GNS3和虛擬機搭建網絡實驗室 1、安裝抓包工具分析數據包2、定義和使用抓包篩選器3、安裝和配置GNS34、配置路由器和VPCS5、使用WireShark捕獲GNS3網絡數據包6、VMware創建虛擬機7、使用思科PacketTracer 1、安裝抓包工具分析數據包 官網安裝wireshark&#xff1a;https://…