欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法

 更新時(shí)間:2023年04月16日 09:31:59   作者:小小怪下士 XIA  
本文主要介紹了詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、前提

  • pId需要傳入用來確認(rèn)第一級(jí)的父節(jié)點(diǎn),而且pId可以為null。
  • 樹實(shí)體類必須實(shí)現(xiàn):TreeNode接口
  • MyTreeVo必須有這三個(gè)屬性:id、pId、children
  • 可以根據(jù)不同需求,配置TreeNode和MyTreeVo中固定的屬性

二、代碼

定義TreeNode接口

public interface TreeNode {
    String getId();
    String getpId();
    List getChildren();
}

需要將pId作為參數(shù)傳入,在方法中添加一個(gè)pId參數(shù),用于確認(rèn)第一級(jí)的父節(jié)點(diǎn)。

  • 這個(gè)示例代碼中,buildTree方法接收兩個(gè)參數(shù),一個(gè)是泛型類型的參數(shù)List,另一個(gè)是pId,用于確認(rèn)第一級(jí)的父節(jié)點(diǎn)。在找到所有的根節(jié)點(diǎn)后,我們需要對(duì)每個(gè)根節(jié)點(diǎn)調(diào)用buildChildren方法,遞歸構(gòu)建子節(jié)點(diǎn)。
  • 以便支持傳入的pId作為頂級(jí)節(jié)點(diǎn)
public class TreeBuilder {
    /**
     * @param nodes 需要構(gòu)建的nodes,不要繼承 TreeNode,且需要有 TreeNode 下的三個(gè)方法
     * @param pId 父id。為null則是所有pid為null的是頂級(jí)節(jié)點(diǎn);不為null,則是從給的pId往下查詢并構(gòu)建樹
     **/
    public static <T extends TreeNode> List<T> buildTree(List<T> nodes, String pId) {
        List<T> roots = new ArrayList<>();
        for (T node : nodes) {
            if (node.getId().equals(pId) || (node.getParentId() == null && (pId == null || pId.equals(node.getId())))) {
                roots.add(node);
            }
        }
        for (T root : roots) {
            buildChildren(root, nodes);
        }
        return roots;
    }
 
    private static <T extends TreeNode> void buildChildren(T node, List<T> nodes) {
        for (T child : nodes) {
            if (child.getParentId() != null && child.getParentId().equals(node.getId())) {
                node.getChildren().add(child);
                buildChildren(child, nodes);
            }
        }
    }
}

構(gòu)建到幾級(jí)

  • 如果再增加一個(gè)參數(shù),構(gòu)建到樹的第幾層該如何實(shí)現(xiàn)?
  • 根據(jù)需求,如果增加一個(gè)參數(shù)來控制構(gòu)建到樹的第幾層,可以在buildChildren方法中添加一個(gè)level參數(shù),用于記錄當(dāng)前節(jié)點(diǎn)的層數(shù)。在遞歸構(gòu)建子節(jié)點(diǎn)時(shí),如果當(dāng)前節(jié)點(diǎn)的層數(shù)小于指定的層數(shù),則繼續(xù)遞歸構(gòu)建子節(jié)點(diǎn),否則停止遞歸。以下是修改后的Java示例代碼:
public class TreeBuilder {
     
     /**
      * @param level 級(jí)別 從1開始。1是最頂層
      **/
    public static <T extends TreeNode> List<T> buildTree(List<T> nodes, String pId, int level) {
        List<T> roots = new ArrayList<>();
        for (T node : nodes) {
            if (node.getId().equals(pId) || (node.getParentId() == null && (pId == null || pId.equals(node.getId())))) {
                roots.add(node);
            }
        }
        for (T root : roots) {
            buildChildren(root, nodes, level, 1);
        }
        return roots;
    }
 
    private static <T extends TreeNode> void buildChildren(T node, List<T> nodes, int level, int currentLevel) {
        if (currentLevel >= level) {
            return;
        }
        for (T child : nodes) {
            if (child.getParentId() != null && child.getParentId().equals(node.getId())) {
                if (node.getChildren() == null) {
                    node.setChildren(new ArrayList<>());
                }
                node.getChildren().add(child);
                buildChildren(child, nodes, level, currentLevel + 1);
            }
        }
    }
}

三、使用

1、實(shí)現(xiàn)TreeNode接口

public class MyTreeVo implements TreeNode {
 
    /**
     * 主鍵
     */
    private String id;
 
    /**
     * 父節(jié)點(diǎn)ID
     */
    private String pId;
 
    /**
     * 子級(jí)
     */
    private List<MyTreeVo> children = Lists.newArrayList();
 
    //其他屬性……
 
    public List<MyTreeVo> getChildren() {
        return children;
    }
 
    public String getId() {
        return id;
    }
 
    public String getpId() {
        return pId;
    }
 
    //其他屬性的getter、setter……

2、使用

  • pId可以傳入null,也可以傳入需要從哪個(gè)節(jié)點(diǎn)(X)開始構(gòu)造的 X的id
List<MyTreeVo> tree = TreeUtilQz.buildTree(vos,null);
//tree就是構(gòu)建好的樹結(jié)構(gòu)數(shù)據(jù)

3、樣例

{
    "data": [
        {
            "id": "e6ee51485389495cb923a122be800011",
            "pId": "",
            "name": "一、鋼管鋼管",
            "children": [
                {
                    "id": "e6ee51485389495cb923a122be800014",
                    "pId": "e6ee51485389495cb923a122be800011",
                    "name": "(二)嘎嘎嘎嘎嘎",
                    "children": []
                },
                {
                    "id": "e6ee51485389495cb923a122be800013",
                    "pId": "e6ee51485389495cb923a122be800011",
                    "name": "(一)頂頂頂頂",
                    "children": []
                }
            ]
        },
        {
            "id": "e6ee51485389495cb923a122be800012",
            "pId": "",
            "name": "二、噢噢噢噢",
            "children": [
                {
                    "id": "e6ee51485389495cb923a122be800015",
                    "pId": "e6ee51485389495cb923a122be800012",
                    "name": "二的下級(jí)",
                    "children": [
                        {
                            "id": "e6ee51485389495cb923a122be800016",
                            "pId": "e6ee51485389495cb923a122be800015",
                            "name": "二的下級(jí)的下級(jí)",
                            "children": []
                        }
                    ]
                }
            ]
        }
    ]
}

到此這篇關(guān)于詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法的文章就介紹到這了,更多相關(guān)Java構(gòu)建樹結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 分布式任務(wù)調(diào)度xxl-job問題解決

    分布式任務(wù)調(diào)度xxl-job問題解決

    這篇文章主要為大家介紹了分布式任務(wù)調(diào)度xxl-job的問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多多多進(jìn)步,早日升職加薪
    2022-03-03
  • java long轉(zhuǎn)String +Codeforces110A案例

    java long轉(zhuǎn)String +Codeforces110A案例

    這篇文章主要介紹了java long轉(zhuǎn)String +Codeforces110A案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 一文帶你玩轉(zhuǎn)Java異常處理

    一文帶你玩轉(zhuǎn)Java異常處理

    這篇文章主要為大家介紹一下Java中的異常處理機(jī)制,文中通過示例為大家進(jìn)行了詳細(xì)的介紹,對(duì)我們學(xué)習(xí)有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • Java 必知必會(huì)的 URL 和 URLConnection使用

    Java 必知必會(huì)的 URL 和 URLConnection使用

    這篇文章主要介紹了Java 必知必會(huì)的 URL 和 URLConnection使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • JAVA Iterator 轉(zhuǎn)成 List 的操作

    JAVA Iterator 轉(zhuǎn)成 List 的操作

    這篇文章主要介紹了JAVA Iterator 轉(zhuǎn)成 List 的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java8中Map常用的遍歷方式

    Java8中Map常用的遍歷方式

    這篇文章主要給大家介紹了關(guān)于Java8中Map常用的遍歷方式,map屬于java中的頂級(jí)接口之一,區(qū)別于list,map是鍵值對(duì)的形式存在,需要的朋友可以參考下
    2023-07-07
  • 快速了解JAVA中的Random()函數(shù)

    快速了解JAVA中的Random()函數(shù)

    這篇文章主要介紹了JAVA中的Random()函數(shù)的使用方法,文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解

    使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解

    這篇文章主要介紹了使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • SpringBoot JavaMailSender發(fā)送郵件功能

    SpringBoot JavaMailSender發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了SpringBoot JavaMailSender發(fā)送郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java字符串拼接詳解

    Java字符串拼接詳解

    大家好,本篇文章主要講的是Java字符串拼接詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02

最新評(píng)論