Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)
更新時間:2024年10月28日 11:30:48 作者:小信丶
這篇文章主要為大家介紹了一個Java工具類,可以實現(xiàn)Java公用實體類轉(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映射到對應的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; // 假設只有一個根節(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)文章
springboot使用Logback把日志輸出到控制臺或輸出到文件
這篇文章給大家介紹springboot項目使用日志工具Logback把日志不僅輸出到控制臺,也可以輸出到文件的操作方法,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-10-10
springboot+mybatis+枚舉處理器的實現(xiàn)
在Spring?boot項目開發(fā)中經(jīng)常遇到需要使用枚舉的場景,本文就介紹了springboot+mybatis+枚舉處理器的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
詳解Java LinkedHashMap與HashMap的使用
這篇文章主要通過幾個示例為大家詳細介紹了Java中LinkedHashMap與HashMap的常見使用和概述,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-10-10

