Java中遞歸構(gòu)建樹形結(jié)構(gòu)的算法解讀
Java遞歸構(gòu)建樹形結(jié)構(gòu)的算法
java遞歸獲取樹
當(dāng)我們處理像部門樹、菜單樹等樹形結(jié)構(gòu)數(shù)據(jù)時,我們需要從后端獲取一組扁平的數(shù)據(jù)列表。
這些數(shù)據(jù)列表通常由一個父節(jié)點ID字段和一個當(dāng)前節(jié)點ID字段組成,這樣我們可以通過這兩個字段建立節(jié)點之間的父子關(guān)系。然后,我們可以利用這些數(shù)據(jù),通過遞歸的方式構(gòu)建樹形結(jié)構(gòu)。
- 在Java后端中,我們可以通過遞歸函數(shù)來實現(xiàn)這一過程。
- 首先,我們需要定義一個樹節(jié)點類,該類包含節(jié)點的基本信息和一個子節(jié)點列表。
- 然后,我們遍歷扁平數(shù)據(jù)列表,對于每一個節(jié)點,我們將其加入到對應(yīng)父節(jié)點的子節(jié)點列表中。
- 如果當(dāng)前節(jié)點沒有子節(jié)點,我們可以直接將其加入到樹的根節(jié)點列表中。
- 然后,我們遞歸處理當(dāng)前節(jié)點的子節(jié)點,直到所有節(jié)點都被加入到樹中。
通過這種方式,我們可以將扁平的數(shù)據(jù)列表轉(zhuǎn)換成樹形結(jié)構(gòu),使得數(shù)據(jù)更加清晰和有序。
這樣,前端可以利用這棵樹來構(gòu)建下拉菜單等形式的界面,為用戶提供更好的體驗。
代碼如下:
public static void main(String[] args) {
// todo 業(yè)務(wù)數(shù)據(jù)
List<TreeVo> treeVoList = new ArrayList<>();
// 處理父節(jié)點為空的情況
treeVoList
.stream()
.filter(obj -> StringUtils.isBlank(obj.getPid()))
.forEach(obj -> obj.setPid("-1"));
// 根據(jù)父節(jié)點分組
Map<String, List<TreeVo>> treeCatch = treeVoList.stream()
.collect(Collectors.groupingBy(TreeVo::getPid));
// 遞歸查詢子節(jié)點,寫入當(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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺析Java中如何處理接口返回的JSON數(shù)據(jù)
在?Java?里處理接口返回的?JSON,最常用的是?Jackson?或?Gson?這兩個庫,下面小編將用最簡單,最實用的方式教你,快跟隨小編一起學(xué)習(xí)一下吧2026-04-04
springboot利用redis、Redisson處理并發(fā)問題的操作
這篇文章主要介紹了springboot利用redis、Redisson處理并發(fā)問題的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
java使用內(nèi)存數(shù)據(jù)庫ssdb的步驟
這篇文章主要介紹了java使用內(nèi)存數(shù)據(jù)庫ssdb的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12
dom4j創(chuàng)建和解析xml文檔的實現(xiàn)方法
下面小編就為大家?guī)硪黄猟om4j創(chuàng)建和解析xml文檔的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06

