Java創(chuàng)建樹形結(jié)構(gòu)算法實(shí)例代碼
在JavaWeb的相關(guān)開發(fā)中經(jīng)常會(huì)涉及到多級(jí)菜單的展示,為了方便菜單的管理需要使用數(shù)據(jù)庫(kù)進(jìn)行支持,本例采用相關(guān)算法講數(shù)據(jù)庫(kù)中的條形記錄進(jìn)行相關(guān)組裝和排序講菜單組裝成樹形結(jié)構(gòu)。
首先是需要的JavaBean
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
/**
* <Description> 菜單擴(kuò)展<br>
*/
public class MenuExt implements Serializable {
/**
* 菜單ID
*/
private Long id;
/**
* 菜單名稱
*/
private String name;
/**
* 菜單地址
*/
private String url;
/**
* 菜單圖標(biāo)
*/
private String icon;
/**
* 父菜單ID
*/
private Long parentId;
/**
* 子菜單
*/
private List<MenuExt> children = new ArrayList<MenuExt>();
/**
* 菜單順序
*/
private Integer ordby;
/**
* 菜單狀態(tài)
*/
private String state;
//省略Getter和Setter
/**
*
* <Description> 孩子節(jié)點(diǎn)排序<br>
*
*/
public void sortChildren() {
Collections.sort(children, new Comparator<MenuExt>() {
@Override
public int compare(MenuExt menu1, MenuExt menu2) {
int result = 0;
Integer ordby1 = menu1.getOrdby();
Integer ordby2 = menu2.getOrdby();
Long id1 = menu1.getId();
Long id2 = menu2.getId();
if (null != ordby1 && null != ordby2) {
result = (ordby1 < ordby2 ? -1 : (ordby1 == ordby2 ? 0 : 1));
} else {
result = (id1 < id2 ? -1 : (id1 == id2 ? 0 : 1));
}
return result;
}
});
// 對(duì)每個(gè)節(jié)點(diǎn)的下一層節(jié)點(diǎn)進(jìn)行排序
for (Iterator<MenuExt> it = children.iterator(); it.hasNext();) {
it.next().sortChildren();
}
}
public List<MenuExt> getChildren() {
return children;
}
public void setChildren(List<MenuExt> children) {
this.children = children;
}
}
Java算法
public static List<MenuExt> createTreeMenus(List<MenuExt> menus) {
List<MenuExt> treeMenus = null;
if (null != menus && !menus.isEmpty()) {
// 創(chuàng)建根節(jié)點(diǎn)
MenuExt root = new MenuExt();
root.setName("菜單根目錄");
// 組裝Map數(shù)據(jù)
Map<Long, MenuExt> dataMap = new HashMap<Long, MenuExt>();
for (MenuExt menu : menus) {
dataMap.put(menu.getId(), menu);
}
// 組裝樹形結(jié)構(gòu)
Set<Entry<Long, MenuExt>> entrySet = dataMap.entrySet();
for (Entry<Long, MenuExt> entry : entrySet) {
MenuExt menu = entry.getValue();
if (null == menu.getParentId() || 0 == menu.getParentId()) {
root.getChildren().add(menu);
} else {
dataMap.get(menu.getParentId()).getChildren().add(menu);
}
}
// 對(duì)樹形結(jié)構(gòu)進(jìn)行二叉樹排序
root.sortChildren();
treeMenus = root.getChildren();
}
return treeMenus;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java遞歸遍歷樹形結(jié)構(gòu)的實(shí)現(xiàn)代碼
- 使用遞歸刪除樹形結(jié)構(gòu)的所有子節(jié)點(diǎn)(java和mysql實(shí)現(xiàn))
- java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu)
- Java實(shí)現(xiàn)樹形結(jié)構(gòu)的示例代碼
- Java數(shù)據(jù)封裝樹形結(jié)構(gòu)代碼實(shí)例
- java轉(zhuǎn)樹形結(jié)構(gòu)工具類詳解
- 使用遞歸算法結(jié)合數(shù)據(jù)庫(kù)解析成Java樹形結(jié)構(gòu)的代碼解析
- 詳解Java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)的兩種方式
- Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)
相關(guān)文章
使用spring-data-redis中的Redis事務(wù)
這篇文章主要介紹了使用spring-data-redis中的Redis事務(wù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Springboot整合camunda+mysql的集成流程分析
本文介紹基于mysql數(shù)據(jù)庫(kù),如何實(shí)現(xiàn)camunda與springboot的集成,如何實(shí)現(xiàn)基于springboot運(yùn)行camunda開源流程引擎,本文分步驟圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06
SpringBoot定時(shí)任務(wù)詳解與案例代碼
SpringBoot是一個(gè)流行的Java開發(fā)框架,它提供了許多便捷的特性來(lái)簡(jiǎn)化開發(fā)過程,其中之一就是定時(shí)任務(wù)的支持,讓開發(fā)人員可以輕松地在應(yīng)用程序中執(zhí)行定時(shí)任務(wù),本文將詳細(xì)介紹如何在Spring?Boot中使用定時(shí)任務(wù),并提供相關(guān)的代碼示例2023-06-06
SpringBoot的10個(gè)參數(shù)驗(yàn)證技巧分享
參數(shù)驗(yàn)證很重要,是平時(shí)開發(fā)環(huán)節(jié)中不可少的一部分,但是我想很多后端同事會(huì)偷懶,干脆不錯(cuò),這樣很可能給系統(tǒng)的穩(wěn)定性和安全性帶來(lái)嚴(yán)重的危害,那么在Spring Boot應(yīng)用中如何做好參數(shù)校驗(yàn)工作呢,本文提供了10個(gè)小技巧,需要的朋友可以參考下2023-09-09
使用@ConditionalOnProperty控制是否加載的操作
這篇文章主要介紹了使用@ConditionalOnProperty控制是否加載的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

