91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java構建樹結構的公共方法是什么

發布時間:2023-04-17 17:45:55 來源:億速云 閱讀:194 作者:iii 欄目:開發技術

這篇“Java構建樹結構的公共方法是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java構建樹結構的公共方法是什么”文章吧。

一、前提

  • pId需要傳入用來確認第一級的父節點,而且pId可以為null。

  • 樹實體類必須實現:TreeNode接口

  • MyTreeVo必須有這三個屬性:id、pId、children

  • 可以根據不同需求,配置TreeNode和MyTreeVo中固定的屬性

二、代碼

定義TreeNode接口

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

需要將pId作為參數傳入,在方法中添加一個pId參數,用于確認第一級的父節點。

  • 這個示例代碼中,buildTree方法接收兩個參數,一個是泛型類型的參數List,另一個是pId,用于確認第一級的父節點。在找到所有的根節點后,我們需要對每個根節點調用buildChildren方法,遞歸構建子節點。

  • 以便支持傳入的pId作為頂級節點

public class TreeBuilder {
    /**
     * @param nodes 需要構建的nodes,不要繼承 TreeNode,且需要有 TreeNode 下的三個方法
     * @param pId 父id。為null則是所有pid為null的是頂級節點;不為null,則是從給的pId往下查詢并構建樹
     **/
    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);
            }
        }
    }
}

構建到幾級

  • 如果再增加一個參數,構建到樹的第幾層該如何實現?

  • 根據需求,如果增加一個參數來控制構建到樹的第幾層,可以在buildChildren方法中添加一個level參數,用于記錄當前節點的層數。在遞歸構建子節點時,如果當前節點的層數小于指定的層數,則繼續遞歸構建子節點,否則停止遞歸。以下是修改后的Java示例代碼:

public class TreeBuilder {
     
     /**
      * @param level 級別 從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、實現TreeNode接口

public class MyTreeVo implements TreeNode {
 
    /**
     * 主鍵
     */
    private String id;
 
    /**
     * 父節點ID
     */
    private String pId;
 
    /**
     * 子級
     */
    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,也可以傳入需要從哪個節點(X)開始構造的 X的id

List<MyTreeVo> tree = TreeUtilQz.buildTree(vos,null);
//tree就是構建好的樹結構數據

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": "二的下級",
                    "children": [
                        {
                            "id": "e6ee51485389495cb923a122be800016",
                            "pId": "e6ee51485389495cb923a122be800015",
                            "name": "二的下級的下級",
                            "children": []
                        }
                    ]
                }
            ]
        }
    ]
}

以上就是關于“Java構建樹結構的公共方法是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沧州市| 宝应县| 洛川县| 连江县| 巨野县| 屏南县| 马山县| 松原市| 思南县| 介休市| 大关县| 福清市| 荣昌县| 阿图什市| 茌平县| 漾濞| 漠河县| 寿光市| 固原市| 台南市| 麻阳| 河北省| 佛学| 长白| 桓仁| 金秀| 犍为县| 图木舒克市| 庆元县| 临朐县| 金华市| 治多县| 金昌市| 会同县| 吉林市| 偏关县| 五家渠市| 宜丰县| 旬阳县| 双鸭山市| 邛崃市|