Java實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的示例代碼
前言
由于業(yè)務(wù)需要,后端需要返回一個(gè)樹(shù)型結(jié)構(gòu)給前端,包含父子節(jié)點(diǎn)的數(shù)據(jù)已經(jīng)在數(shù)據(jù)庫(kù)中存儲(chǔ)好,現(xiàn)在需要做的是如何以樹(shù)型結(jié)構(gòu)的形式返給給前端。
數(shù)據(jù)庫(kù)表結(jié)構(gòu)
實(shí)現(xiàn)思路
1、拿到有父子節(jié)點(diǎn)的集合數(shù)據(jù)
2、遍歷集合數(shù)據(jù),拿到所有的根節(jié)點(diǎn)
3、遍歷根節(jié)點(diǎn),拿到所有的子節(jié)點(diǎn)
4、遞歸子節(jié)點(diǎn),將遞歸的子節(jié)點(diǎn)接上其父節(jié)點(diǎn),直到子節(jié)點(diǎn)為空,遞歸完成
5、遞歸好后以集合形式返回,返回前端時(shí)以JSON格式轉(zhuǎn)換后返回
具體代碼
1、造數(shù)據(jù),和數(shù)據(jù)庫(kù)表數(shù)據(jù)一致
package com.lyq.generateTree; import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.List; /** * @author : [LiuYanQiang] * @version : [v1.0] * @className : TreeMain * @description : [描述說(shuō)明該類的功能] * @createTime : [2022/5/3 0:05] * @updateUser : [LiuYanQiang] * @updateTime : [2022/5/3 0:05] * @updateRemark : [描述說(shuō)明本次修改內(nèi)容] */ public class TreeMain { public static void main(String[] args) { List<Tree> list = new ArrayList<>(); //造數(shù)據(jù) list.add(new Tree("22650", "0", "第一周")); list.add(new Tree("22651", "22650", "1.1 隨堂練習(xí):《你認(rèn)為以下屬于人工智能的是什么呢?》,時(shí)間:0.5min")); list.add(new Tree("22652", "22650", "1.2 主題討論:《使用循環(huán)代碼塊繪制正五角星》,時(shí)間:5min")); list.add(new Tree("22653", "22650", "1.3 主題討論:《延時(shí)測(cè)試》,時(shí)間:0.5min")); list.add(new Tree("22654", "22650", "1.4 調(diào)查問(wèn)卷:《測(cè)試延時(shí)時(shí)間》, 時(shí)間:0.5min")); list.add(new Tree("22655", "22650", "1.5 研究與挑戰(zhàn):翟文彪老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22656", "22650", "1.6 研究與挑戰(zhàn):米新江教授開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22657", "22656", "1.6.1 研究與挑戰(zhàn):丁中文老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22658", "22656", "1.6.2 研究與挑戰(zhàn):郝曉軍老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22659", "22656", "1.6.3 研究與挑戰(zhàn):張娟老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22660", "22656", "1.6.4 研究與挑戰(zhàn):王懷軍老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22661", "22656", "1.6.5 研究與挑戰(zhàn):何操老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22662", "22656", "1.6.6 研究與挑戰(zhàn):武新麗老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22663", "22656", "1.6.7 一鍵簽到:人臉識(shí)別,時(shí)間:2min")); list.add(new Tree("22664", "22656", "1.6.8 手勢(shì)簽到:人臉識(shí)別22,時(shí)間:2min")); list.add(new Tree("22665", "22656", "1.6.9 研究與挑戰(zhàn):吳欣明老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22666", "22656", "1.6.10 研究與挑戰(zhàn):程艷艷老師開(kāi)播啦,時(shí)間:1min,[N]")); list.add(new Tree("22667", "22656", "1.6.11 研究與挑戰(zhàn):本學(xué)期課程內(nèi)容,時(shí)間:0.5min")); list.add(new Tree("22668", "22656", "1.6.12 研究與挑戰(zhàn):米老師的教學(xué)團(tuán)隊(duì)介紹,時(shí)間:0.3min")); list.add(new Tree("22669", "22650", "1.7 研究與挑戰(zhàn):米老師的教學(xué)團(tuán)隊(duì)介紹,時(shí)間:0.3min")); list.add(new Tree("22670", "22650", "1.8 研究與挑戰(zhàn):米老師的教學(xué)團(tuán)隊(duì)介紹,時(shí)間:0.3min")); list.add(new Tree("22671", "22650", "1.9 研究與挑戰(zhàn):助教機(jī)器人提醒您參與活動(dòng),時(shí)間:2min")); list.add(new Tree("22672", "22650", "1.10 研究與挑戰(zhàn):AR系統(tǒng)使用教程-學(xué)生端,時(shí)間:5min")); list.add(new Tree("22673", "22672", "1.10.1 研究與挑戰(zhàn):不一樣的課堂修改版,時(shí)間:0.5min")); list.add(new Tree("22674", "22673", "1.10.1.1 研究與挑戰(zhàn):下載AR APP,時(shí)間:8min")); list.add(new Tree("22675", "22674", "1.10.1.1.1 研究與挑戰(zhàn):修改版手機(jī)端AR助教機(jī)器人的登錄,時(shí)間:5min")); list.add(new Tree("22676", "22674", "1.10.1.1.2 研究與挑戰(zhàn):app頁(yè)面展示,時(shí)間:2min")); list.add(new Tree("22677", "22674", "1.10.1.1.3 研究與挑戰(zhàn):使用網(wǎng)頁(yè)版方式, 時(shí)間:3min")); list.add(new Tree("22678", "22674", "1.10.1.1.4 研究與挑戰(zhàn):《使用學(xué)習(xí)通賬號(hào)密碼登錄AR網(wǎng)頁(yè)版》,時(shí)間:5min")); list.add(new Tree("22679", "22674", "1.10.1.1.5 主題討論:修改時(shí)間2022年4月4日《上傳:進(jìn)入AR網(wǎng)頁(yè)版后的界面》,時(shí)間:3min")); list.add(new Tree("22680", "22673", "1.10.1.2 研究與挑戰(zhàn):AR學(xué)生端教程視頻,時(shí)間:2min")); list.add(new Tree("22681", "22672", "1.10.2 研究與挑戰(zhàn):修改時(shí)間2022年4月4日溫馨提示-釘釘,時(shí)間:0.3min")); list = new ReplacementTree().builTree(list); String jsonString = JSON.toJSONString(list); System.out.println(jsonString); } }
2、樹(shù)型結(jié)構(gòu)實(shí)體類
package com.lyq.generateTree; import java.util.ArrayList; import java.util.List; /** * @author : [LiuYanQiang] * @version : [v1.0] * @className : ReplacementTree * @description : [樹(shù)型結(jié)構(gòu)裝換] * @createTime : [2022/5/2 23:37] * @updateUser : [LiuYanQiang] * @updateTime : [2022/5/2 23:37] * @updateRemark : [描述說(shuō)明本次修改內(nèi)容] */ public class ReplacementTree { /* * @version V1.0 * Title: builTree * @author LiuYanQiang * @description 始樹(shù)形結(jié)構(gòu)創(chuàng)建 * @createTime 2022/5/3 0:18 * @param [list] * @return java.util.List<com.lyq.generateTree.Tree>*/ public List<Tree> builTree(List<Tree> list) { List<Tree> treeList = new ArrayList<>(); for (Tree tree : this.getRootNode(list)) { //建立子樹(shù)節(jié)點(diǎn) tree = this.buildChilTree(tree,list); //為根節(jié)點(diǎn)設(shè)置子樹(shù)節(jié)點(diǎn) treeList.add(tree); } return treeList; } /* * @version V1.0 * Title: buildChilTree * @author LiuYanQiang * @description 通過(guò)遞歸來(lái)創(chuàng)建子樹(shù)形結(jié)構(gòu) * @createTime 2022/5/3 0:18 * @param [tree, list] * @return com.lyq.generateTree.Tree*/ private Tree buildChilTree(Tree tree,List<Tree> list) { List<Tree> treeList = new ArrayList<>(); for (Tree t : list) { //判斷當(dāng)前父節(jié)點(diǎn)是否存在子節(jié)點(diǎn) if (t.getP_id().equals(tree.getId())) { treeList.add(this.buildChilTree(t,list)); } } tree.setChildren(treeList); return tree; } /* * @version V1.0 * Title: getRootNode * @author LiuYanQiang * @description 獲取全部根節(jié)點(diǎn) * @createTime 2022/5/3 0:18 * @param [list] * @return java.util.List<com.lyq.generateTree.Tree>*/ private List<Tree> getRootNode(List<Tree> list) { List<Tree> rootList = new ArrayList<>(); for (Tree tree : list) { if (tree.getP_id().equals("0")) { rootList.add(tree); } } return rootList; } }
最后返回情況如下
到此這篇關(guān)于Java實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的示例代碼的文章就介紹到這了,更多相關(guān)Java樹(shù)形結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文帶你徹底了解Java8中的Lambda,函數(shù)式接口和Stream
- Java的Lambda表達(dá)式和Stream流的作用以及示例
- Java分析Lambda表達(dá)式Stream流合并分組內(nèi)對(duì)象數(shù)據(jù)合并
- Java中的lambda和stream實(shí)現(xiàn)排序
- Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法
- 吊打Java面試官之Lambda表達(dá)式 Stream API
- Java8中Lambda表達(dá)式使用和Stream API詳解
- 詳解Java遞歸實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的兩種方式
- Java樹(shù)形結(jié)構(gòu)數(shù)據(jù)生成導(dǎo)出excel文件方法記錄
- Java使用 Stream 流和 Lambda 組裝復(fù)雜父子樹(shù)形結(jié)構(gòu)
相關(guān)文章
SpringBoot Swagger2 接口規(guī)范示例詳解
Swagger(在谷歌、IBM、微軟等公司的支持下)做了一個(gè)公共的文檔風(fēng)格來(lái)填補(bǔ)上述問(wèn)題,在本文中,我們將會(huì)學(xué)習(xí)怎么使用Swagger的 Swagger2注解去生成REST API文檔,感興趣的朋友一起看看吧2023-12-12SpringBoot自定義工具類實(shí)現(xiàn)Excel數(shù)據(jù)存入MySQL數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了如何使用EasyExcel讀取Excel內(nèi)數(shù)據(jù)并轉(zhuǎn)換為csv格式數(shù)據(jù),然后實(shí)現(xiàn)字符串分割,分割出屬性名和屬性值建表插入MySQL數(shù)據(jù)庫(kù)中,感興趣的可以了解下2024-03-03Springboot使用@Cacheable注解實(shí)現(xiàn)數(shù)據(jù)緩存
本文介紹如何在Springboot中通過(guò)@Cacheable注解實(shí)現(xiàn)數(shù)據(jù)緩存,在每次調(diào)用添加了@Cacheable注解的方法時(shí),Spring 會(huì)檢查指定參數(shù)的指定目標(biāo)方法是否已經(jīng)被調(diào)用過(guò),文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10JAVA簡(jiǎn)單分組的算法實(shí)現(xiàn)
本文介紹了“JAVA簡(jiǎn)單分組的算法實(shí)現(xiàn)”,需要的朋友可以參考一下2013-03-03JavaCV與FFmpeg音視頻流處理技巧總結(jié)大全
JavaCV是一個(gè)開(kāi)源的Java接口,它為幾個(gè)著名的計(jì)算機(jī)視覺(jué)庫(kù)(如OpenCV、FFmpeg)提供了Java封裝,這篇文章主要給大家介紹了關(guān)于JavaCV與FFmpeg音視頻流處理技巧總結(jié)的相關(guān)資料,需要的朋友可以參考下2024-05-05