使用Java實現通用樹形結構轉換工具類:深入解析TreeUtil和TreeNode接口

文章目錄

    • 一、TreeNode接口設計
    • 二、TreeUtil工具類設計
    • 三、示例:實現TreeNode接口的節點類
    • 四、示例:使用TreeUtil構建樹形結構
    • 五、總結

在這里插入圖片描述

🎉歡迎來到Java學習路線專欄~探索Java中的靜態變量與實例變量


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒🍹
  • ?博客主頁:IT·陳寒的博客
  • 🎈該系列文章專欄:Java學習路線
  • 📜其他專欄:Java學習路線 Java面試技巧 Java實戰項目 AIGC人工智能 數據結構學習
  • 🍹文章作者技術和水平有限,如果文中出現錯誤,希望大家能指正🙏
  • 📜 歡迎大家關注! ??

在實際開發中,樹形結構的數據處理是一個常見的需求。例如,組織架構、分類管理、評論回復等,都需要將數據以樹形結構展示。本文將深入解析如何使用Java實現一個通用的樹形結構轉換工具類,包括 TreeUtilTreeNode 接口的設計與實現。

一、TreeNode接口設計

首先,我們需要設計一個 TreeNode 接口,用于約束樹節點對象必須具備的一些基本功能和屬性。具體包括獲取節點ID、父節點ID和子節點列表的方法。

public interface TreeNode<T> {T getId(); // 獲取節點IDT getParentId(); // 獲取父節點IDvoid setChildren(List<TreeNode<T>> children); // 設置子節點列表List<TreeNode<T>> getChildren(); // 獲取子節點列表
}

二、TreeUtil工具類設計

接下來,我們設計一個 TreeUtil 工具類,用于將平鋪的數據列表轉換為樹形結構。主要包括兩個方法:buildTreefindRootNodes

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class TreeUtil {/*** 將平鋪的數據列表轉換為樹形結構* @param nodes 所有節點列表* @param rootParentId 根節點的父ID* @param <T> 節點ID類型* @return 樹形結構列表*/public static <T> List<TreeNode<T>> buildTree(List<TreeNode<T>> nodes, T rootParentId) {// 創建一個ID到節點的映射Map<T, TreeNode<T>> nodeMap = new HashMap<>();for (TreeNode<T> node : nodes) {nodeMap.put(node.getId(), node);}// 創建一個用于存儲根節點的列表List<TreeNode<T>> rootNodes = new ArrayList<>();// 遍歷所有節點,將節點掛載到其父節點上for (TreeNode<T> node : nodes) {T parentId = node.getParentId();if (rootParentId.equals(parentId)) {rootNodes.add(node);} else {TreeNode<T> parentNode = nodeMap.get(parentId);if (parentNode != null) {List<TreeNode<T>> children = parentNode.getChildren();if (children == null) {children = new ArrayList<>();parentNode.setChildren(children);}children.add(node);}}}return rootNodes;}/*** 從平鋪的數據列表中找到所有根節點* @param nodes 所有節點列表* @param rootParentId 根節點的父ID* @param <T> 節點ID類型* @return 根節點列表*/public static <T> List<TreeNode<T>> findRootNodes(List<TreeNode<T>> nodes, T rootParentId) {List<TreeNode<T>> rootNodes = new ArrayList<>();for (TreeNode<T> node : nodes) {if (rootParentId.equals(node.getParentId())) {rootNodes.add(node);}}return rootNodes;}
}

三、示例:實現TreeNode接口的節點類

為了更好地理解 TreeNode 接口和 TreeUtil 工具類的使用,下面實現一個具體的節點類 CategoryNode

import java.util.ArrayList;
import java.util.List;public class CategoryNode implements TreeNode<Long> {private Long id;private Long parentId;private String name;private List<TreeNode<Long>> children = new ArrayList<>();public CategoryNode(Long id, Long parentId, String name) {this.id = id;this.parentId = parentId;this.name = name;}@Overridepublic Long getId() {return id;}@Overridepublic Long getParentId() {return parentId;}@Overridepublic void setChildren(List<TreeNode<Long>> children) {this.children = children;}@Overridepublic List<TreeNode<Long>> getChildren() {return children;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "CategoryNode{" +"id=" + id +", parentId=" + parentId +", name='" + name + '\'' +", children=" + children +'}';}
}

四、示例:使用TreeUtil構建樹形結構

接下來,通過示例數據,展示如何使用 TreeUtil 構建樹形結構。

import java.util.Arrays;
import java.util.List;public class TreeUtilExample {public static void main(String[] args) {List<TreeNode<Long>> nodes = Arrays.asList(new CategoryNode(1L, 0L, "Root Node"),new CategoryNode(2L, 1L, "Child Node 1"),new CategoryNode(3L, 1L, "Child Node 2"),new CategoryNode(4L, 2L, "Child Node 1.1"),new CategoryNode(5L, 2L, "Child Node 1.2"),new CategoryNode(6L, 3L, "Child Node 2.1"));List<TreeNode<Long>> tree = TreeUtil.buildTree(nodes, 0L);for (TreeNode<Long> node : tree) {System.out.println(node);}}
}

運行上述示例代碼,輸出結果如下:

CategoryNode{id=1, parentId=0, name='Root Node', children=[CategoryNode{id=2, parentId=1, name='Child Node 1', children=[CategoryNode{id=4, parentId=2, name='Child Node 1.1', children=[]}, CategoryNode{id=5, parentId=2, name='Child Node 1.2', children=[]}]}, CategoryNode{id=3, parentId=1, name='Child Node 2', children=[CategoryNode{id=6, parentId=3, name='Child Node 2.1', children=[]}]}]}

五、總結

通過以上步驟,我們實現了一個通用的樹形結構轉換工具類 TreeUtil,并結合 TreeNode 接口實現了具體的節點類 CategoryNode。通過示例數據,展示了如何使用 TreeUtil 構建樹形結構。希望這篇文章能幫助你在實際開發中更好地處理樹形結構數據。


🧸結尾 ?? 感謝您的支持和鼓勵! 😊🙏
📜您可能感興趣的內容:

  • 【Java面試技巧】Java面試八股文 - 掌握面試必備知識(目錄篇)
  • 【Java學習路線】2023年完整版Java學習路線圖
  • 【AIGC人工智能】Chat GPT是什么,初學者怎么使用Chat GPT,需要注意些什么
  • 【Java實戰項目】SpringBoot+SSM實戰:打造高效便捷的企業級Java外賣訂購系統
  • 【數據結構學習】從零起步:學習數據結構的完整路徑

在這里插入圖片描述

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

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

相關文章

基于vue腳手架創建的圖書商城

功能簡介 此項目包括首頁, 搜索列表, 商品詳情, 購物車, 訂單, 支付, 用戶登陸/注冊等多個子模塊&#xff0c;使用 Vue 全家 桶ES6WebpackAxios 等技術&#xff0c;采用模塊化、組件化、工程化的模式開發。 功能模塊圖 2.1首頁 2.2.搜索列表 2.3.商品詳情 2.4.購物車 2.5.支…

條件測試,if語句,case語句

測試命令 格式1&#xff1a;test 條件表達式 格式2&#xff1a;[條件表達式] test命令和 [ ] 相同&#xff0c;建議使用[ ] #方框中要空格 #用test可能會不小心定義變量文件測試 常見的測試操作符含義-d檢查文件是否存在且為目錄-f檢查文件是否存在且為常規文件-L測試…

解決json日期格式問題

解決json日期格式問題 1.json默認輸出時間格式 RequestMapping("/json3") public String json3() throws JsonProcessingException {ObjectMapper mapper new ObjectMapper();//創建時間一個對象&#xff0c;java.util.DateDate date new Date();//將我們的對象解…

Knife4j:快速入門

1. 概述 Knife4j是一個用于生成和展示API文檔的工具&#xff0c;同時它還提供了在線調試的功能&#xff0c;下圖是其工作界面。 * Knife4j有多個版本&#xff0c;最新版的Knife4j基于開源項目springdoc-openapi&#xff0c;這個開源項目的核心功能就是根據SpringBoot項目中的代…

uniapp uniCloud云開發

uniCloud概述 uniCloud 是 DCloud 聯合阿里云、騰訊云、支付寶云&#xff0c;為開發者提供的基于 serverless 模式和 js 編程的云開發平臺。 uniCloud 的 web控制臺地址&#xff1a;https://unicloud.dcloud.net.cn 文檔&#xff1a;https://doc.dcloud.net.cn/uniCloud/ un…

大模型應用-多模態和大模型是如何相互成就的

前言 如果單純的將大模型用來聊天&#xff0c;那就是low了。 而多模態賦予了大模型更多的現實價值&#xff0c;大模型則助力多模態變得更強大。 多模態 我們所處的是一個物理世界&#xff0c;不同事物之間模態多種多樣&#xff0c;即便是簡單的文本&#xff0c;按照語言&am…

【Docker0】網絡更改

目錄 1. 停止docker服務 2. 關閉docker默認橋接網絡接口 3. 從系統刪除docker0接口 4. 創建一個名為bridge0的新接口 5. 添加ip地址和子網掩碼 6. 啟用bridge0接口 7. &#xff08;如果沒起來就執行該句&#xff09; 8. 查看ip 1. 停止docker服務 sudo service docker…

c++用什么軟件編程?都有哪些?

c用什么軟件編程&#xff1f;都有哪些&#xff1f; C 作為一種高效、面向對象的編程語言&#xff0c;廣泛應用于軟件開發、游戲開發、嵌入式系統等領域。那么在進行 C 編程時&#xff0c;我們通常會使用哪些軟件呢&#xff1f;下面就來具體分析。 1. Visual Studio Visual Stu…

深入 SSH:解鎖本地轉發、遠程轉發和動態轉發的潛力

文章目錄 前言一、解鎖內部服務&#xff1a;SSH 本地轉發1.1 什么是 SSH 本地轉發1.2 本地轉發應用場景 二、打開外部訪問大門&#xff1a;SSH 遠程轉發2.1 什么是 SSH 遠程轉發2.2 遠程轉發應用場景 三、動態轉發&#xff1a;SSH 讓你擁有自己的 VPN3.1 什么是 SSH 動態轉發3.…

mysqldump全備份之后,如何只恢復一個庫或者一個表

在實際工作中,一個MySQL實例中可能有多個database。而我們備份時,通常采用完全備份,將所有database都備份到一個文件中。 但是,偶爾會遇到只恢復一個database或者一個表的情況。怎么解決呢? 一、利用全備恢復一個庫(database)的數據 案例:朋友在群里問, MySQL全庫備份…

memory動態內存管理學習之weak_ptr

此頭文件是動態內存管理庫的一部分。std::weak_ptr 是一種智能指針&#xff0c;它持有對被 std::shared_ptr 管理的對象的非擁有性&#xff08;“弱”&#xff09;引用。在訪問所引用的對象前必須先轉換為 std::shared_ptr。std::weak_ptr 用來表達臨時所有權的概念&#xff1a…

three.js實現雪花場景效果

點擊獲取雪花圖片素材 提取碼:lywa // 雪花效果 import * as THREE from "three" export function getsnowEffect(th) {console.log(th, th) // this 場景var that th// 創建一個BufferGeometry對象&#xff0c;用于存儲頂點數據 const geometry new THREE.Buffe…

Vim神兵:精通自定義補全規則

標題&#xff1a;Vim神兵&#xff1a;精通自定義補全規則 摘要 Vim作為Linux上最強大的文本編輯器之一&#xff0c;其補全功能可以極大提高編碼效率。本文將詳細探討如何在Vim中自定義補全規則&#xff0c;包括基本的補全設置、使用Vim腳本擴展補全功能&#xff0c;以及如何利…

大模型微調實戰之基于星火大模型的群聊對話分角色要素提取挑戰賽:Task01:跑通Baseline

目錄 0 背景1 環境配置1.1 下載包1.2 配置密鑰1.3 測試模型 2 解決問題2.1 獲取數據2.2 設計Prompt2.2 設計處理函數2.3 開始提取 附全流程代碼 0 背景 Datawhale AI夏令營第二期開始啦&#xff0c;去年有幸參與過第一期&#xff0c;收獲很多&#xff0c;這次也立馬參與了第二…

VMware ESXi 技術

目錄 一、VMware ESXi安裝 1. 在VMware WorkStation中創建一臺虛擬機 2. 進入VMware ESXi控制臺 3. 配置VMware ESXi網絡 二、使用Web網頁端登錄管理ESXi 1. 分配許可證密鑰&#xff08;選做&#xff09; 2. 管理ESXi 三、VMware ESXi控制臺 1. 創建虛擬機 2. 定制虛擬…

Webpack: 開發 PWA、Node、Electron 應用

概述 毋庸置疑&#xff0c;對前端開發者而言&#xff0c;當下正是一個日升月恒的美好時代&#xff01;在久遠的過去&#xff0c;Web 頁面的開發技術鏈條非常原始而粗糙&#xff0c;那時候的 JavaScript 更多用來點綴 Web 頁面交互而不是用來構建一個完整的應用。直到 2009年5月…

LINUX操作系統:Mx Linux,用虛擬機VMware Workstation安裝體驗

需求說明&#xff1a; 操作系統目前流行有Windows、Linux、Unix等&#xff0c;中國人應該要知道國有操作系統&#xff0c;也要支持國產操作系統&#xff0c;為了更好支持國產操作系統&#xff0c;我們也要知己知彼&#xff0c;那么今天就來體驗一把操作系統Mx_Linux_23.2的安裝…

分享一個下載windows系統鏡像包的網站

下載各種操作系統&#xff08;比如Windows、Linux、MacOS等&#xff09;比較快的鏡像站點&#xff0c;我嘗試過這個不錯&#xff0c;提供了BT連接&#xff0c;可以用迅雷軟件下載&#xff0c;速度很快的&#xff01; 入口地址&#xff1a;NEXT, ITELLYOU 1&#xff09;打開網站…

[XYCTF新生賽2024] pwn

用了一周來復現crypto部分(不能算是復現&#xff0c;拿著 糖醋小雞塊的WP一點點學了下)。 兩天時間復現PWN部分。相對來說PWN比密碼這塊要簡單&#xff0c;不過ARM,MIPS懶得學了&#xff0c;跳過。 malloc_flag 題目先打開flag將建0x100的塊&#xff0c;然后把flag讀入再fre…

[深度學習] Transformer

Transformer是一種深度學習模型&#xff0c;最早由Vaswani等人在2017年的論文《Attention is All You Need》中提出。它最初用于自然語言處理&#xff08;NLP&#xff09;任務&#xff0c;但其架構的靈活性使其在許多其他領域也表現出色&#xff0c;如計算機視覺、時間序列分析…