Java中遞歸構(gòu)建樹形結(jié)構(gòu)的算法解讀
Java遞歸構(gòu)建樹形結(jié)構(gòu)的算法
java遞歸獲取樹
當(dāng)我們處理像部門樹、菜單樹等樹形結(jié)構(gòu)數(shù)據(jù)時(shí),我們需要從后端獲取一組扁平的數(shù)據(jù)列表。
這些數(shù)據(jù)列表通常由一個(gè)父節(jié)點(diǎn)ID字段和一個(gè)當(dāng)前節(jié)點(diǎn)ID字段組成,這樣我們可以通過這兩個(gè)字段建立節(jié)點(diǎn)之間的父子關(guān)系。然后,我們可以利用這些數(shù)據(jù),通過遞歸的方式構(gòu)建樹形結(jié)構(gòu)。
- 在Java后端中,我們可以通過遞歸函數(shù)來實(shí)現(xiàn)這一過程。
- 首先,我們需要定義一個(gè)樹節(jié)點(diǎn)類,該類包含節(jié)點(diǎn)的基本信息和一個(gè)子節(jié)點(diǎn)列表。
- 然后,我們遍歷扁平數(shù)據(jù)列表,對于每一個(gè)節(jié)點(diǎn),我們將其加入到對應(yīng)父節(jié)點(diǎn)的子節(jié)點(diǎn)列表中。
- 如果當(dāng)前節(jié)點(diǎn)沒有子節(jié)點(diǎn),我們可以直接將其加入到樹的根節(jié)點(diǎn)列表中。
- 然后,我們遞歸處理當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn),直到所有節(jié)點(diǎn)都被加入到樹中。
通過這種方式,我們可以將扁平的數(shù)據(jù)列表轉(zhuǎn)換成樹形結(jié)構(gòu),使得數(shù)據(jù)更加清晰和有序。
這樣,前端可以利用這棵樹來構(gòu)建下拉菜單等形式的界面,為用戶提供更好的體驗(yàn)。
代碼如下:
public static void main(String[] args) {
// todo 業(yè)務(wù)數(shù)據(jù)
List<TreeVo> treeVoList = new ArrayList<>();
// 處理父節(jié)點(diǎn)為空的情況
treeVoList
.stream()
.filter(obj -> StringUtils.isBlank(obj.getPid()))
.forEach(obj -> obj.setPid("-1"));
// 根據(jù)父節(jié)點(diǎn)分組
Map<String, List<TreeVo>> treeCatch = treeVoList.stream()
.collect(Collectors.groupingBy(TreeVo::getPid));
// 遞歸查詢子節(jié)點(diǎn),寫入當(dāng)前數(shù)據(jù)
treeVoList = findChildren(treeCatch, "-1");
// 打印
for (TreeVo treeVo : treeVoList) {
System.out.println(JacksonUtil.bean2json(treeVo));
}
}
private static List<TreeVo> findChildren(Map<String, List<TreeVo>> treeCatch, String parentId) {
List<TreeVo> children = treeCatch.getOrDefault(parentId, new ArrayList<>());
for (TreeVo treeVo : children) {
List<TreeVo> subChildren = findChildren(treeCatch, treeVo.getId());
treeVo.getChildren().addAll(subChildren);
}
return children;
}
/**
* 獲取場地樹RVO
*/
public class TreeVo {
/**
* ID
*/
private String id;
/**
* 名稱
*/
private String name;
/**
* 父ID
*/
private String pid;
/**
* 子級
*/
private transient List<TreeVo> children;
// 此處省略get\set
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合MinIO實(shí)現(xiàn)文件存儲系統(tǒng)的代碼示例
在現(xiàn)代的應(yīng)用程序中,文件存儲和管理是一個(gè)常見的需求,MinIO是一個(gè)開源的對象存儲系統(tǒng),與Spring?Boot框架結(jié)合使用,可以快速構(gòu)建高性能的文件存儲系統(tǒng),本文將介紹如何使用Spring?Boot和MinIO來實(shí)現(xiàn)文件存儲系統(tǒng)2023-06-06
SpringMVC多個(gè)文件上傳及上傳后立即顯示圖片功能
這篇文章主要介紹了SpringMVC多個(gè)文件上傳及上傳后立即顯示圖片功能,非常不錯(cuò),具有參考借鑒價(jià)值功能,需要的朋友可以參考下2017-10-10
SpringBoot?將配置文件掛到?jar?包外面的操作方法
在 SpringBoot 中,可以將配置文件放在 jar 包外面,這樣可以方便地修改配置而不需要重新打包和部署,這篇文章主要介紹了SpringBoot?如何將配置文件掛到?jar?包外面,需要的朋友可以參考下2023-03-03
Springboot整合PageOffice 實(shí)現(xiàn)word在線編輯保存功能
這篇文章主要介紹了Springboot整合PageOffice 實(shí)現(xiàn)word在線編輯保存,本文以Samples5 為示例文件結(jié)合示例代碼給大家詳細(xì)介紹,需要的朋友可以參考下2021-08-08
Java將日期類型Date時(shí)間戳轉(zhuǎn)換為MongoDB的時(shí)間類型數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于Java將日期類型Date時(shí)間戳轉(zhuǎn)換為MongoDB的時(shí)間類型數(shù)據(jù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
Java服務(wù)端服務(wù)監(jiān)控:Prometheus與Spring Boot Actuator的集成方式
本文介紹了如何將Prometheus與SpringBootActuator集成,實(shí)現(xiàn)對Java服務(wù)端應(yīng)用的監(jiān)控,通過集成,可以利用Prometheus的強(qiáng)大監(jiān)控能力,及時(shí)發(fā)現(xiàn)和解決性能問題2024-12-12

