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

🎉歡迎來到Java學習路線專欄~探索Java中的靜態變量與實例變量
- ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒🍹
- ?博客主頁:IT·陳寒的博客
- 🎈該系列文章專欄:Java學習路線
- 📜其他專欄:Java學習路線 Java面試技巧 Java實戰項目 AIGC人工智能 數據結構學習
- 🍹文章作者技術和水平有限,如果文中出現錯誤,希望大家能指正🙏
- 📜 歡迎大家關注! ??
在實際開發中,樹形結構的數據處理是一個常見的需求。例如,組織架構、分類管理、評論回復等,都需要將數據以樹形結構展示。本文將深入解析如何使用Java實現一個通用的樹形結構轉換工具類,包括 TreeUtil
和 TreeNode
接口的設計與實現。
一、TreeNode接口設計
首先,我們需要設計一個 TreeNode
接口,用于約束樹節點對象必須具備的一些基本功能和屬性。具體包括獲取節點ID、父節點ID和子節點列表的方法。
public interface TreeNode<T> {T getId(); // 獲取節點IDT getParentId(); // 獲取父節點IDvoid setChildren(List<TreeNode<T>> children); // 設置子節點列表List<TreeNode<T>> getChildren(); // 獲取子節點列表
}
二、TreeUtil工具類設計
接下來,我們設計一個 TreeUtil
工具類,用于將平鋪的數據列表轉換為樹形結構。主要包括兩個方法:buildTree
和 findRootNodes
。
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外賣訂購系統
- 【數據結構學習】從零起步:學習數據結構的完整路徑