JAVA遞歸生成樹形菜單的實(shí)現(xiàn)過程
遞歸生成一個如圖的菜單,編寫兩個類數(shù)據(jù)模型Menu、和創(chuàng)建樹形的MenuTree。通過以下過程實(shí)現(xiàn):
1.首先從菜單數(shù)據(jù)中獲取所有根節(jié)點(diǎn)。
2.為根節(jié)點(diǎn)建立次級子樹并拼接上。
3.遞歸為子節(jié)點(diǎn)建立次級子樹并接上,直至為末端節(jié)點(diǎn)拼接上空的“樹”。

首先,編寫數(shù)據(jù)模型Menu。每條菜單有自己的id、父節(jié)點(diǎn)parentId、菜單名稱text、菜單還擁有次級菜單children。
import java.util.List;
public class Menu {
private String id;
private String parentId;
private String text;
private String url;
private String yxbz;
private List<Menu> children;
public Menu(String id,String parentId,String text,String url,String yxbz) {
this.id=id;
this.parentId=parentId;
this.text=text;
this.url=url;
this.yxbz=yxbz;
}
/*省略get\set*/
}創(chuàng)建樹形結(jié)構(gòu)的類MenuTree。方法getRootNode獲取所有根節(jié)點(diǎn),方法builTree將根節(jié)點(diǎn)匯總創(chuàng)建樹形結(jié)構(gòu),buildChilTree為節(jié)點(diǎn)建立次級樹并拼接上當(dāng)前樹,遞歸調(diào)用buildChilTree不斷為當(dāng)前樹開枝散葉直至找不到新的子樹。完成遞歸,獲取樹形結(jié)構(gòu)。
import java.util.ArrayList;
import java.util.List;
public class MenuTree {
private List<Menu> menuList = new ArrayList<Menu>();
public MenuTree(List<Menu> menuList) {
this.menuList=menuList;
}
//建立樹形結(jié)構(gòu)
public List<Menu> builTree(){
List<Menu> treeMenus =new ArrayList<Menu>();
for(Menu menuNode : getRootNode()) {
menuNode=buildChilTree(menuNode);
treeMenus.add(menuNode);
}
return treeMenus;
}
//遞歸,建立子樹形結(jié)構(gòu)
private Menu buildChilTree(Menu pNode){
List<Menu> chilMenus =new ArrayList<Menu>();
for(Menu menuNode : menuList) {
if(menuNode.getParentId().equals(pNode.getId())) {
chilMenus.add(buildChilTree(menuNode));
}
}
pNode.setChildren(chilMenus);
return pNode;
}
//獲取根節(jié)點(diǎn)
private List<Menu> getRootNode() {
List<Menu> rootMenuLists =new ArrayList<Menu>();
for(Menu menuNode : menuList) {
if(menuNode.getParentId().equals("0")) {
rootMenuLists.add(menuNode);
}
}
return rootMenuLists;
}
}最后,插入一些數(shù)據(jù)試試效果。得到的json就可以生成圖一菜單了。
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
public class Hello {
public static void main(String []args) {
List<Menu> menuList= new ArrayList<Menu>();
/*插入一些數(shù)據(jù)*/
menuList.add(new Menu("GN001D000","0","系統(tǒng)管理","/admin","Y"));
menuList.add(new Menu("GN001D100","GN001D000","權(quán)限管理","/admin","Y"));
menuList.add(new Menu("GN001D110","GN001D100","密碼修改","/admin","Y"));
menuList.add(new Menu("GN001D120","GN001D100","新加用戶","/admin","Y"));
menuList.add(new Menu("GN001D200","GN001D000","系統(tǒng)監(jiān)控","/admin","Y"));
menuList.add(new Menu("GN001D210","GN001D200","在線用戶","/admin","Y"));
menuList.add(new Menu("GN002D000","0","訂閱區(qū)","/admin","Y"));
menuList.add(new Menu("GN003D000","0","未知領(lǐng)域","/admin","Y"));
/*讓我們創(chuàng)建樹*/
MenuTree menuTree =new MenuTree(menuList);
menuList=menuTree.builTree();
/*轉(zhuǎn)為json看看效果*/
String jsonOutput= JSON.toJSONString(menuList);
System.out.println(jsonOutput);
}
}補(bǔ)充:java遞歸生成樹形結(jié)構(gòu)菜單
一、mysql表,數(shù)據(jù)自行準(zhǔn)備
CREATE TABLE `sys_menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pid` bigint(20) DEFAULT NULL, `title` varchar(255) CHARACTER SET utf8 DEFAULT NULL, `path` varchar(255) CHARACTER SET utf8 DEFAULT NULL, `level` int(11) DEFAULT NULL, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=200 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
二、創(chuàng)建對應(yīng)的實(shí)體類
public class Menu implements Serializable {
private static final long serialVersionUID = -5990021029947688358L;
private Integer id;
private String title;//菜單標(biāo)題
private String path;//路徑
private Integer pid;//父菜單ID 一級菜單pid為null
private Integer level;//級別,排序用
private List<Menu> children = new ArrayList<Menu>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public List<Menu> getChildren() {
return children;
}
public void setChildren(List<Menu> children) {
this.children = children;
}
}
三、遞歸組裝樹形結(jié)構(gòu)函數(shù)實(shí)現(xiàn)
? /**
? ? ? ? ?* @方法名: parseMenuTree<br>
? ? ? ? ?* @描述: 組裝菜單<br>
? ? ? ? ?* @param list 數(shù)據(jù)庫里面獲取到的全量菜單列表
? ? ? ? ?* @return
? ? ? ? ?*/
? ? ? ? public static List<Menu> parseMenuTree(List<Menu> list){
?? ? ? ?List<Menu> result = new ArrayList<Menu>();
?? ??? ?
?? ? ? ?// 1、獲取第一級節(jié)點(diǎn)
?? ? ? ?for (Menu menu : list) {
?? ? ? ? ? ?if(null == menu.getPid()) {
?? ??? ? ? ?result.add(menu);
?? ??? ?}?? ?
?? ? ? ?}
?? ??? ?
?? ? ? ?// 2、遞歸獲取子節(jié)點(diǎn)
?? ? ? ?for (Menu parent : result) {
?? ??? ?parent = recursiveTree(parent, list);
?? ? ? ?}
?? ??? ?
?? ? ? ?return result;
?? ?}
?? ?
?? ?public static Menu recursiveTree(Menu parent, List<Menu> list) {
?? ? ? ?for (Menu menu : list) {
?? ? ? ? ? ?if(Objects.equals(parent.getId(),menu.getPid())) {
?? ??? ? ? ?menu = recursiveTree(menu, list);
?? ??? ? ? ?parent.getChildren().add(menu);
?? ??? ?}
?? ? ? ?}
?? ??? ? ? ?
?? ? ? ?return parent;
?? ?}四、從數(shù)據(jù)庫獲取菜單數(shù)據(jù),調(diào)用組裝菜單函數(shù)生成樹形結(jié)構(gòu)的數(shù)據(jù)
? public static void main(String[] args) {
?? ??? ?
?? ??? ?List<Menu> list = new ArrayList<Menu>();
?? ??? ?//TODO 這里從數(shù)據(jù)庫獲取全量菜單后放到list中
?? ??? ?
?? ??? ?//樹形結(jié)構(gòu)數(shù)據(jù)生成
?? ??? ?List<Menu> result = parseMenuTree(list);
?? ??? ?
?? ??? ?System.out.println(JSONObject.toJSONString(result));
?? ?}到此這篇關(guān)于JAVA遞歸生成樹形菜單的文章就介紹到這了,更多相關(guān)JAVA遞歸生成樹形菜單內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Spring AOP中args()和argNames的含義
這篇文章主要介紹了Spring AOP中args()和argNames的含義,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java編程實(shí)現(xiàn)swing圓形按鈕實(shí)例代碼
這篇文章主要介紹了Java編程實(shí)現(xiàn)swing圓形按鈕實(shí)例代碼,涉及兩個簡單的Java實(shí)現(xiàn)按鈕的代碼,其中一個具有偵測點(diǎn)擊事件的簡單功能,具有一定借鑒價(jià)值,需要的朋友可以參考。2017-11-11
springboot?@Async?注解如何實(shí)現(xiàn)方法異步
這篇文章主要介紹了springboot?@Async?注解如何實(shí)現(xiàn)方法異步,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Intellij idea使用Statistic統(tǒng)計(jì)代碼行數(shù)的方法
這篇文章主要介紹了Intellij idea使用Statistic統(tǒng)計(jì)代碼行數(shù)的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
SpringSecurity中的UserDetails和UserDetailsService接口詳解
這篇文章主要介紹了SpringSecurity中的UserDetails和UserDetailsService接口詳解,UserDetailsService 在 Spring Security 中主要承擔(dān)查詢系統(tǒng)內(nèi)用戶、驗(yàn)證密碼、封裝用戶信息和角色權(quán)限,需要的朋友可以參考下2023-11-11

