Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)
工具類
import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; // 樹節(jié)點類,用于存儲樹中的每個元素 class TreeNode<T> { private T data; // 節(jié)點存儲的數(shù)據(jù) private List<TreeNode<T>> children = new ArrayList<>(); // 子節(jié)點列表 // 構(gòu)造函數(shù),初始化節(jié)點數(shù)據(jù) public TreeNode(T data) { this.data = data; } // 添加子節(jié)點 public void addChild(TreeNode<T> child) { children.add(child); } // 獲取當前節(jié)點的數(shù)據(jù) public T getData() { return data; } // 獲取當前節(jié)點的所有子節(jié)點 public List<TreeNode<T>> getChildren() { return children; } } // 樹構(gòu)建器類,負責從列表構(gòu)建樹形結(jié)構(gòu) class TreeBuilder<T> { // buildTree方法,構(gòu)建樹形結(jié)構(gòu) public TreeNode<T> buildTree(List<T> items, Function<T, String> idExtractor, Function<T, String> parentIdExtractor) { // 創(chuàng)建一個映射,將每個節(jié)點的ID映射到對應(yīng)的TreeNode對象 Map<String, TreeNode<T>> nodeMap = items.stream() .map(item -> new TreeNode<>(item)) // 將每個元素轉(zhuǎn)換為TreeNode .collect(Collectors.toMap(node -> idExtractor.apply(node.getData()), Function.identity())); TreeNode<T> root = null; // 用于存儲根節(jié)點 // 遍歷每個元素,建立父子關(guān)系 for (T item : items) { String id = idExtractor.apply(item); // 獲取當前節(jié)點的ID String parentId = parentIdExtractor.apply(item); // 獲取父節(jié)點的ID TreeNode<T> node = nodeMap.get(id); // 獲取當前節(jié)點 if (parentId == null) { root = node; // 假設(shè)只有一個根節(jié)點 } else { TreeNode<T> parentNode = nodeMap.get(parentId); // 獲取父節(jié)點 if (parentNode != null) { parentNode.addChild(node); // 將當前節(jié)點添加到父節(jié)點的子節(jié)點列表中 } } } return root; // 返回構(gòu)建的樹的根節(jié)點 } }
注釋說明:
TreeNode類:
- 每個字段和方法都有注釋,說明其用途。
- 包含構(gòu)造函數(shù)、添加子節(jié)點的方法以及獲取數(shù)據(jù)和子節(jié)點的方法。
TreeBuilder類:
- buildTree方法的邏輯注釋清晰,解釋了每一步的目的。
- 使用映射將每個實體轉(zhuǎn)換為樹節(jié)點,并建立父子關(guān)系。
代碼示例
import java.util.Arrays; import java.util.List; // 實體類,用于表示樹節(jié)點的數(shù)據(jù) class Entity { private String id; // 節(jié)點ID private String parentId; // 父節(jié)點ID private String name; // 節(jié)點名稱 // 構(gòu)造函數(shù) public Entity(String id, String parentId, String name) { this.id = id; this.parentId = parentId; this.name = name; } // 獲取節(jié)點ID public String getId() { return id; } // 獲取父節(jié)點ID public String getParentId() { return parentId; } // 獲取節(jié)點名稱 public String getName() { return name; } } // 主程序 public class Main { public static void main(String[] args) { // 創(chuàng)建實體列表,模擬樹形結(jié)構(gòu) List<Entity> entities = Arrays.asList( new Entity("1", null, "Root"), // 根節(jié)點 new Entity("2", "1", "Child 1"), // Child 1, 父節(jié)點為Root new Entity("3", "1", "Child 2"), // Child 2, 父節(jié)點為Root new Entity("4", "2", "Grandchild 1") // Grandchild 1, 父節(jié)點為Child 1 ); // 創(chuàng)建樹構(gòu)建器實例 TreeBuilder<Entity> treeBuilder = new TreeBuilder<>(); // 構(gòu)建樹,傳入實體列表及提取ID和父ID的函數(shù) TreeNode<Entity> tree = treeBuilder.buildTree( entities, Entity::getId, // 提取ID Entity::getParentId // 提取父ID ); // 打印樹結(jié)構(gòu) printTree(tree, 0); } // 遞歸打印樹結(jié)構(gòu)的輔助方法 private static void printTree(TreeNode<Entity> node, int level) { if (node == null) return; // 如果節(jié)點為空,直接返回 // 打印當前節(jié)點的名稱,縮進顯示層級 System.out.println(" ".repeat(level) + node.getData().getName()); // 遞歸打印所有子節(jié)點 for (TreeNode<Entity> child : node.getChildren()) { printTree(child, level + 1); } } }
代碼注釋說明:
Entity類:每個字段和方法都有注釋,說明其用途和功能。
Main類:
- 實體列表中每個節(jié)點的構(gòu)造都有注釋,解釋其層級關(guān)系。
- 構(gòu)建樹的步驟清晰描述,便于理解。
printTree方法:詳細說明其遞歸邏輯和輸出格式。
到此這篇關(guān)于Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)Java公用實體類轉(zhuǎn)Tree結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決MyBatis中為類配置別名,列名與屬性名不對應(yīng)的問題
這篇文章主要介紹了解決MyBatis中為類配置別名,列名與屬性名不對應(yīng)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11springboot使用Logback把日志輸出到控制臺或輸出到文件
這篇文章給大家介紹springboot項目使用日志工具Logback把日志不僅輸出到控制臺,也可以輸出到文件的操作方法,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-10-10springboot+mybatis+枚舉處理器的實現(xiàn)
在Spring?boot項目開發(fā)中經(jīng)常遇到需要使用枚舉的場景,本文就介紹了springboot+mybatis+枚舉處理器的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03詳解Java LinkedHashMap與HashMap的使用
這篇文章主要通過幾個示例為大家詳細介紹了Java中LinkedHashMap與HashMap的常見使用和概述,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-10-10