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

java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)完整案例

 更新時(shí)間:2023年04月21日 09:12:06   作者:無(wú)顏?zhàn)?246  
遞歸算法的代碼比較簡(jiǎn)潔,可讀性較好;但是在實(shí)際的業(yè)務(wù)處理中會(huì)出現(xiàn)多次的重復(fù)調(diào)用,如果處理不好,很容易出現(xiàn)StackOverflowError報(bào)錯(cuò),這篇文章主要給大家介紹了關(guān)于java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下

前言

本文提供兩種遞歸實(shí)現(xiàn)思路

樹形結(jié)構(gòu)數(shù)據(jù),大體的實(shí)現(xiàn)思路就是“父找子”,父節(jié)點(diǎn)去層層遞歸尋找子節(jié)點(diǎn),最后組裝成數(shù)據(jù)集合。

提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、樹形結(jié)構(gòu)是什么?

樹形結(jié)構(gòu),和我們平常所觸及到的無(wú)限級(jí)菜單,是同一個(gè)道理。

所謂樹形結(jié)構(gòu),我們可以將其理解為:樹根或者樹冠,都可以無(wú)限分叉下去。

現(xiàn)有一張表,需要對(duì)表中數(shù)據(jù)進(jìn)行分級(jí)查詢(按照上下級(jí)關(guān)系進(jìn)行排列),我們常用的數(shù)據(jù)庫(kù)有: oracle和mysql;

如果使用oracle的話,使用connect by,很容易就能做到;

但是,mysql沒有現(xiàn)成的遞歸函數(shù),需要我們自己使用存儲(chǔ)過(guò)程封裝,而且,就算封裝好了遞歸函數(shù),mysql在執(zhí)行的時(shí)候,查詢速度會(huì)很慢。如何解決這個(gè)問(wèn)題呢?

既然數(shù)據(jù)庫(kù)不給力,我們只能交由程序來(lái)處理了,以減輕mysql數(shù)據(jù)庫(kù)的壓力。

二、實(shí)現(xiàn)方案

1、stream流遞歸實(shí)現(xiàn)

1.1 實(shí)體類

public class TreeBean {
 
    /**
     * id
     */
    private Integer id;
 
    /**
     * 名稱
     */
    private String name;
 
    /**
     * 父id ,根節(jié)點(diǎn)為0
     */
    public Integer parentId;
 
    /**
     * 子節(jié)點(diǎn)信息
     */
    public List<TreeBean> childList;
 
    public TreeBean() {
    }
 
    public TreeBean(Integer id, String name, Integer parentId, List<TreeBean> childList) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.childList = childList;
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getParentId() {
        return parentId;
    }
 
    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }
 
    public List<TreeBean> getChildList() {
        return childList;
    }
 
    public void setChildList(List<TreeBean> childList) {
        this.childList = childList;
    }
 
    /**
     * 初始化數(shù)據(jù)
     * @return
     */
    public List<TreeBean> initializationData() {
        List<TreeBean> list = new ArrayList<>();
        TreeBean t1 = new TreeBean(1, "廣東省", 0, new ArrayList<>());
        TreeBean t2 = new TreeBean(2, "湖南省", 0, new ArrayList<>());
        TreeBean t3 = new TreeBean(3, "廣州市", 1, new ArrayList<>());
        TreeBean t4 = new TreeBean(4, "長(zhǎng)沙市", 2, new ArrayList<>());
        TreeBean t5 = new TreeBean(5, "白云區(qū)", 3, new ArrayList<>());
        TreeBean t6 = new TreeBean(6, "黃浦區(qū)", 3, new ArrayList<>());
        TreeBean t7 = new TreeBean(7, "白云街道", 5, new ArrayList<>());
        TreeBean t8 = new TreeBean(8, "深圳市", 1, new ArrayList<>());
        TreeBean t9 = new TreeBean(9, "寶安區(qū)", 8, new ArrayList<>());
        TreeBean t10 = new TreeBean(10, "福田區(qū)", 8, new ArrayList<>());
        TreeBean t11 = new TreeBean(11, "南山區(qū)", 8, new ArrayList<>());
        TreeBean t12 = new TreeBean(12, "南山街道", 11, new ArrayList<>());
        TreeBean t13 = new TreeBean(13, "芙蓉區(qū)", 4, new ArrayList<>());
        TreeBean t14 = new TreeBean(14, "岳麓區(qū)", 4, new ArrayList<>());
        TreeBean t15 = new TreeBean(15, "開福區(qū)", 4, new ArrayList<>());
        TreeBean t16 = new TreeBean(16, "岳陽(yáng)市", 2, new ArrayList<>());
        TreeBean t17 = new TreeBean(17, "岳麓街道", 14, new ArrayList<>());
        list.add(t1);
        list.add(t2);
        list.add(t3);
        list.add(t4);
        list.add(t5);
        list.add(t6);
        list.add(t7);
        list.add(t8);
        list.add(t9);
        list.add(t10);
        list.add(t11);
        list.add(t12);
        list.add(t13);
        list.add(t14);
        list.add(t15);
        list.add(t16);
        list.add(t17);
        return list;
    }
}

1.2 實(shí)現(xiàn)類

/**
     * 方式一:Stream流遞歸實(shí)現(xiàn)遍歷樹形結(jié)構(gòu)
     */
    public static void treeTest1() {
        //獲取數(shù)據(jù)
        List<TreeBean> treeBeans = new TreeBean().initializationData();
        //獲取父節(jié)點(diǎn)
        List<TreeBean> collect = treeBeans.stream().filter(t -> t.getParentId() == 0).map(
                m -> {
                    m.setChildList(getChildren(m, treeBeans));
                    return m;
                }
        ).collect(Collectors.toList());
        System.out.println(JSON.toJSONString(collect));
    }

    /**
     * 遞歸查詢子節(jié)點(diǎn)
     * @param root  根節(jié)點(diǎn)
     * @param all   所有節(jié)點(diǎn)
     * @return 根節(jié)點(diǎn)信息
     */
    public static List<TreeBean> getChildren(TreeBean root, List<TreeBean> all) {
        List<TreeBean> children = all.stream().filter(t -> {
            return Objects.equals(t.getParentId(), root.getId());
        }).map(
                m -> {
                    m.setChildList(getChildren(m, all));
                    return m;
                }
        ).collect(Collectors.toList());
        return children;
    }

2、jdk1.7以下實(shí)現(xiàn)

2.1 節(jié)點(diǎn)類

便于提供前端取值

2.2 實(shí)現(xiàn)類

3、應(yīng)用場(chǎng)景

3.1 用于前端方便展示

如圖

3.2 用于查找并構(gòu)建子節(jié)點(diǎn)數(shù)據(jù)

以刪除菜單做例子,一般菜單未免會(huì)帶子菜單,所以,“父找子” 需求應(yīng)聲而來(lái);

代碼如下:

總結(jié)

資料參考:

到此這篇關(guān)于java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)的文章就介紹到這了,更多相關(guān)java遞歸樹形結(jié)構(gòu)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java排序算法之選擇排序詳解

    java排序算法之選擇排序詳解

    這篇文章主要為大家詳細(xì)介紹了java排序算法之選擇排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法

    java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法

    今天小編就為大家分享一篇java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Sentinel中實(shí)現(xiàn)限流的兩種方法

    Sentinel中實(shí)現(xiàn)限流的兩種方法

    本文給大家介紹了Sentinel中實(shí)現(xiàn)限流的兩種方法,限流是一種通過(guò)控制系統(tǒng)對(duì)外提供的資源、服務(wù)或接口的訪問(wèn)數(shù)量或速率,以保護(hù)系統(tǒng)免受過(guò)載的一種策略,需要的朋友可以參考下
    2024-02-02
  • 簡(jiǎn)單闡述一下Java集合的概要

    簡(jiǎn)單闡述一下Java集合的概要

    今天給大家?guī)?lái)的文章是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java集合的概要展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 為什么Java項(xiàng)目中別用!=null做判空

    為什么Java項(xiàng)目中別用!=null做判空

    本文主要介紹了為什么Java項(xiàng)目中別用!=null做判空,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java中逆序遍歷List集合的實(shí)現(xiàn)

    Java中逆序遍歷List集合的實(shí)現(xiàn)

    本文主要介紹了Java中逆序遍歷List集合的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • IDEA無(wú)法識(shí)別相關(guān)module模塊問(wèn)題的解決過(guò)程

    IDEA無(wú)法識(shí)別相關(guān)module模塊問(wèn)題的解決過(guò)程

    這篇文章主要給大家介紹了關(guān)于IDEA無(wú)法識(shí)別相關(guān)module模塊問(wèn)題的解決過(guò)程,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用IDEA具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Spring Boot實(shí)現(xiàn)文件上傳示例代碼

    Spring Boot實(shí)現(xiàn)文件上傳示例代碼

    本篇文章主要介紹了Spring Boot實(shí)現(xiàn)文件上傳示例代碼,可以實(shí)現(xiàn)單文件和多文件的上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Java調(diào)用第三方接口封裝實(shí)現(xiàn)

    Java調(diào)用第三方接口封裝實(shí)現(xiàn)

    本文主要介紹了Java調(diào)用第三方接口封裝實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java的main方法使用及說(shuō)明

    Java的main方法使用及說(shuō)明

    這篇文章主要介紹了Java的main方法使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論

聂荣县| 洞头县| 东乡| 甘泉县| 芜湖县| 炎陵县| 无为县| 额尔古纳市| 湛江市| 蒙自县| 建始县| 罗山县| 巫山县| 海宁市| 陆良县| 东阳市| 济宁市| 新化县| 石河子市| 香港| 武夷山市| 会东县| 榆社县| 许昌市| 江安县| 元阳县| 当雄县| 湄潭县| 加查县| 华坪县| 台南县| 蓬溪县| 元谋县| 涪陵区| 清流县| 昌宁县| 莱阳市| 太谷县| 施甸县| 晋江市| 喜德县|