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

