Java創(chuàng)建樹形結(jié)構(gòu)算法實例代碼
在JavaWeb的相關(guān)開發(fā)中經(jīng)常會涉及到多級菜單的展示,為了方便菜單的管理需要使用數(shù)據(jù)庫進行支持,本例采用相關(guān)算法講數(shù)據(jù)庫中的條形記錄進行相關(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> 菜單擴展<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é)點排序<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; } }); // 對每個節(jié)點的下一層節(jié)點進行排序 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é)點 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); } } // 對樹形結(jié)構(gòu)進行二叉樹排序 root.sortChildren(); treeMenus = root.getChildren(); } return treeMenus; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java遞歸遍歷樹形結(jié)構(gòu)的實現(xiàn)代碼
- 使用遞歸刪除樹形結(jié)構(gòu)的所有子節(jié)點(java和mysql實現(xiàn))
- java實現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu)
- Java實現(xiàn)樹形結(jié)構(gòu)的示例代碼
- Java數(shù)據(jù)封裝樹形結(jié)構(gòu)代碼實例
- java轉(zhuǎn)樹形結(jié)構(gòu)工具類詳解
- 使用遞歸算法結(jié)合數(shù)據(jù)庫解析成Java樹形結(jié)構(gòu)的代碼解析
- 詳解Java遞歸實現(xiàn)樹形結(jié)構(gòu)的兩種方式
- Java接口返回省市區(qū)樹形結(jié)構(gòu)的實現(xiàn)
相關(guān)文章
Mybatis中的config.xml配置文件詳細(xì)解析
這篇文章主要介紹了詳解Mybatis-config.xml配置文件,需要的朋友可以參考下2017-12-12基于Spring Boot的Logback日志輪轉(zhuǎn)配置詳解
本篇文章主要介紹了基于Spring Boot的Logback日志輪轉(zhuǎn)配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10相冊管理系統(tǒng)(Java表單+xml數(shù)據(jù)庫存儲)
這篇文章主要為大家詳細(xì)介紹了相冊管理系統(tǒng)的實現(xiàn)步驟,Java表單的文件上傳和下載,xml數(shù)據(jù)庫存儲信息,感興趣的小伙伴們可以參考一下2016-07-07Java給JFrame窗口設(shè)置熱鍵的方法實現(xiàn)
這篇文章主要介紹了Java給JFrame窗口設(shè)置熱鍵的方法實現(xiàn),文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07詳解使用MyBatis Generator自動創(chuàng)建代碼
這篇文章主要介紹了使用MyBatis Generator自動創(chuàng)建代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12IDEA配置tomcat的方法、IDEA配置tomcat運行web項目詳解
這篇文章主要介紹了IDEA配置tomcat的方法、IDEA配置tomcat運行web項目詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot詳解整合Spring?Boot?Admin實現(xiàn)監(jiān)控功能
這篇文章主要介紹了SpringBoot整合Spring?Boot?Admin實現(xiàn)服務(wù)監(jiān)控,內(nèi)容包括Server端服務(wù)開發(fā),Client端服務(wù)開發(fā)其中Spring?Boot?Admin還可以對其監(jiān)控的服務(wù)提供告警功能,如服務(wù)宕機時,可以及時以郵件方式通知運維人員,感興趣的朋友跟隨小編一起看看吧2022-07-07