Java如何處理數(shù)據(jù)成為樹狀結(jié)構(gòu)
Java處理數(shù)據(jù)成為樹狀結(jié)構(gòu)
如題所示,項(xiàng)目中需要將部分?jǐn)?shù)據(jù)處理成為樹狀結(jié)構(gòu)
實(shí)現(xiàn)過程
注:也可以使用sql達(dá)到該目的,但此處數(shù)據(jù)不多,故在代碼中處理,主要是sql處理不是很會(huì)
// 獲取需要封裝的數(shù)據(jù)
List<Data> dataAll = service.findAll();
if (CollUtil.isEmpty(dataAll)) {
return new ArrayList<>();
}
// 獲取頂層目錄 項(xiàng)目中上級(jí)編碼為空則為一級(jí)目錄
List<Data> parentList = dataAll.stream()
.filter(item -> ObjectUtil.isEmpty(item.getParentNumber())).collect(Collectors.toList());
// 獲取下級(jí)目錄,上級(jí)編碼不為空則非一級(jí)目錄
List<Data> childList = dataAll.stream()
.filter(item -> ObjectUtil.isNotEmpty(item.getParentNumber())).collect(Collectors.toList());
// 封裝樹狀結(jié)構(gòu)
return parentList.stream().map(item1 -> {
Data chapterVo = new Data();
BeanUtils.copyProperties(item1, chapterVo);
List<Data> videoVoList = childList.stream()
.filter(item2 -> item1.getBackgroundManagementCategoryNumber().equals(item2.getParentNumber()))
.map(item3 -> {
Data videoVo = new Data();
BeanUtils.copyProperties(item3, videoVo);
return videoVo;
})
.collect(Collectors.toList());
chapterVo.setChildren(videoVoList);
return chapterVo;
}).collect(Collectors.toList());
Java將查出來的數(shù)據(jù)拼樹
遞歸方法構(gòu)建樹
/**
* 使用遞歸方法建樹
* @param menuTrees 子節(jié)點(diǎn)集合 / 返回的數(shù)據(jù)
* @return List
*/
public static List<Dept> buildByRecursive(List<Dept> menuTrees) {
List<Dept> trees = new ArrayList<>();
for (Dept menuTree : menuTrees) {
//查找根節(jié)點(diǎn)
if (menuTree.getPcode() == null) {
trees.add(findChildren(menuTree,menuTrees));
}
}
return trees;
}/**
* 遞歸查找子節(jié)點(diǎn)
* @param menuTree 菜單數(shù)對(duì)象
* @param menuTrees 子節(jié)點(diǎn)
* @return MenuTree
*/
private static Dept findChildren(Dept menuTree,List<Dept> menuTrees){
for (Dept it : menuTrees) {
if(menuTree.getCode().equals(it.getPcode())) {
if (menuTree.getChildren() == null) {
menuTree.setChildren(new ArrayList<>());
}
menuTree.getChildren().add(findChildren(it,menuTrees));
}
}
return menuTree;
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringValidation自定義注解及分組校驗(yàn)功能詳解
這篇文章主要介紹了SpringValidation自定義注解及分組校驗(yàn)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的三種方案分享
在電商和其他涉及到在線支付的應(yīng)用中,通常需要實(shí)現(xiàn)一個(gè)功能:如果用戶在生成訂單后的一定時(shí)間內(nèi)未完成支付,系統(tǒng)將自動(dòng)取消該訂單,本文將詳細(xì)介紹基于Spring Boot框架實(shí)現(xiàn)訂單30分鐘內(nèi)未支付自動(dòng)取消的幾種方案,并提供實(shí)例代碼,需要的朋友可以參考下2023-10-10
Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例
這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
SpringBoot切面實(shí)現(xiàn)token權(quán)限校驗(yàn)詳解
這篇文章主要介紹了SpringBoot切面實(shí)現(xiàn)token權(quán)限校驗(yàn)詳解,要實(shí)現(xiàn)權(quán)限校驗(yàn),首先數(shù)據(jù)表和實(shí)體類上需要有權(quán)限字段,我的表中permission和gender是通過外鍵約束permission表和gender表實(shí)現(xiàn)枚舉的,因?yàn)榭赏卣剐愿?需要的朋友可以參考下2024-01-01
Java AQS(AbstractQueuedSynchronizer)源碼解析
AbstractQueuedSynchronizer被稱為隊(duì)列同步器,簡稱為大家熟知的AQS,這個(gè)類可以稱作concurrent包的基礎(chǔ)。本文將通過剖析源碼來看看AQS是如何工作的,感興趣的可以了解一下2023-02-02
Springboot+Vue+axios實(shí)現(xiàn)文章收藏功能
這篇文章主要為大家詳細(xì)介紹了Springboot+Vue+axios實(shí)現(xiàn)文章收藏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
java 實(shí)現(xiàn)取int型的第二個(gè)字節(jié)的數(shù)
這篇文章主要介紹了java 實(shí)現(xiàn)取int型的第二個(gè)字節(jié)的數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
淺談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別
下面小編就為大家?guī)硪黄獪\談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08

