最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)公用實(shí)體類轉(zhuǎn)Tree結(jié)構(gòu)

 更新時(shí)間:2024年10月28日 11:30:48   作者:小信丶  
這篇文章主要為大家介紹了一個(gè)Java工具類,可以實(shí)現(xiàn)Java公用實(shí)體類轉(zhuǎn)Tree結(jié)構(gòu),文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以參考一下

工具類

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
 
// 樹節(jié)點(diǎn)類,用于存儲(chǔ)樹中的每個(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;
    }
}
 
// 樹構(gòu)建器類,負(fù)責(zé)從列表構(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)建一個(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)換為TreeNode
                .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)建的樹的根節(jié)點(diǎn)
    }
}

注釋說(shuō)明:

TreeNode類:

  • 每個(gè)字段和方法都有注釋,說(shuō)明其用途。
  • 包含構(gòu)造函數(shù)、添加子節(jié)點(diǎn)的方法以及獲取數(shù)據(jù)和子節(jié)點(diǎn)的方法。

TreeBuilder類:

  • buildTree方法的邏輯注釋清晰,解釋了每一步的目的。
  • 使用映射將每個(gè)實(shí)體轉(zhuǎn)換為樹節(jié)點(diǎn),并建立父子關(guān)系。

代碼示例

import java.util.Arrays;
import java.util.List;
 
// 實(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)名稱
 
    // 構(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)名稱
    public String getName() {
        return name;
    }
}
 
// 主程序
public class Main {
    public static void main(String[] args) {
        // 創(chuàng)建實(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)建樹構(gòu)建器實(shí)例
        TreeBuilder<Entity> treeBuilder = new TreeBuilder<>();
        
        // 構(gòu)建樹,傳入實(shí)體列表及提取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é)點(diǎn)為空,直接返回
 
        // 打印當(dāng)前節(jié)點(diǎn)的名稱,縮進(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類:每個(gè)字段和方法都有注釋,說(shuō)明其用途和功能。

Main類

  • 實(shí)體列表中每個(gè)節(jié)點(diǎn)的構(gòu)造都有注釋,解釋其層級(jí)關(guān)系。
  • 構(gòu)建樹的步驟清晰描述,便于理解。

printTree方法:詳細(xì)說(shuō)明其遞歸邏輯和輸出格式。

到此這篇關(guān)于Java實(shí)現(xiàn)公用實(shí)體類轉(zhuǎn)Tree結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)Java公用實(shí)體類轉(zhuǎn)Tree結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java復(fù)制(拷貝)數(shù)組的4種方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan

    Java復(fù)制(拷貝)數(shù)組的4種方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRa

    這篇文章主要介紹了Java復(fù)制(拷貝)數(shù)組的4種方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • springboot之自動(dòng)裝配全過(guò)程

    springboot之自動(dòng)裝配全過(guò)程

    這篇文章主要介紹了springboot之自動(dòng)裝配全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring核心IoC容器的依賴注入接口和層級(jí)包命名規(guī)范

    Spring核心IoC容器的依賴注入接口和層級(jí)包命名規(guī)范

    這篇文章主要介紹了Spring核心IoC容器的依賴注入接口和層級(jí)包命名規(guī)范,IOC又名控制反轉(zhuǎn),把對(duì)象創(chuàng)建和對(duì)象之間的調(diào)用過(guò)程,交給Spring進(jìn)行管理,目的是為了降低耦合度,需要的朋友可以參考下
    2023-05-05
  • MyBatis入門初體驗(yàn)之使用大全(2)

    MyBatis入門初體驗(yàn)之使用大全(2)

    這篇文章主要介紹了MyBatis入門初體驗(yàn)之使用大全(2)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • 基于線程池的工作原理與源碼解讀

    基于線程池的工作原理與源碼解讀

    下面小編就為大家分享一篇基于線程池的工作原理與源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • SpringBoot中的PropertySource原理詳解

    SpringBoot中的PropertySource原理詳解

    這篇文章主要介紹了SpringBoot中的PropertySource原理詳解,PropertySource?是一個(gè)非常重要的概念,它允許您在應(yīng)用程序中定義屬性,并將這些屬性注入到?Spring?環(huán)境中,需要的朋友可以參考下
    2023-07-07
  • 使用synchronized關(guān)鍵字實(shí)現(xiàn)信號(hào)量的方法

    使用synchronized關(guān)鍵字實(shí)現(xiàn)信號(hào)量的方法

    在Java中,信號(hào)量(Semaphore)是一種常用的同步工具,它可以用來(lái)控制對(duì)共享資源的訪問數(shù)量,下面,我們將使用Synchronized關(guān)鍵字來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的信號(hào)量,我們的目標(biāo)是實(shí)現(xiàn)一個(gè)計(jì)數(shù)信號(hào)量,其中信號(hào)量的計(jì)數(shù)指示可以同時(shí)訪問某一資源的線程數(shù),需要的朋友可以參考下
    2024-04-04
  • springboot themaleaf 第一次進(jìn)頁(yè)面不加載css的問題

    springboot themaleaf 第一次進(jìn)頁(yè)面不加載css的問題

    這篇文章主要介紹了springboot themaleaf 第一次進(jìn)頁(yè)面不加載css的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java關(guān)于MyBatis緩存詳解

    Java關(guān)于MyBatis緩存詳解

    緩存的重要性是不言而喻的,使用緩存,我們可以避免頻繁的與數(shù)據(jù)庫(kù)進(jìn)行交互,尤其是在查詢?cè)蕉?、緩存命中率越高的情況下,使用緩存對(duì)性能的提高更明顯。本文將給大家詳細(xì)的介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值
    2021-09-09
  • Java操作數(shù)據(jù)庫(kù)(行級(jí)鎖,for update)

    Java操作數(shù)據(jù)庫(kù)(行級(jí)鎖,for update)

    這篇文章主要介紹了Java操作數(shù)據(jù)庫(kù)(行級(jí)鎖,for update),文章圍繞Java操作數(shù)據(jù)庫(kù)的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2021-12-12

最新評(píng)論

岗巴县| 邯郸县| 肥西县| 克拉玛依市| 兰考县| 稻城县| 平阳县| 治县。| 西盟| 苏州市| 美姑县| 化隆| 泾川县| 攀枝花市| 吉木萨尔县| 太原市| 哈尔滨市| 巴马| 古田县| 灵石县| 辉县市| 株洲县| 台安县| 沾益县| 大姚县| 西宁市| 米泉市| 麦盖提县| 庆城县| 海淀区| 崇义县| 东莞市| 沙湾县| 马公市| 景宁| 津南区| 莱西市| 万载县| 杭锦旗| 罗平县| 康定县|