JAVA递归生成树形菜单

摘要:
递归生成如图所示的菜单,编写两个类数据模型menu,并创建树形MenuTree。3.递归地为子节点创建一个子子树,并将其连接起来,直到端节点上方的“树”被拼接。每个菜单都有自己的id、父节点parentId、菜单名文本,菜单也有子菜单子菜单。1importjava.util.List;23publicclassMenu{4privateStringid;5privateStringparentId;6privateStringtext;7privateStringurl;8privateStringyxbz;9privateList<Menu>children;10publicMenu{11this.id=id;12this.parentId=parentId;13this.text=text;14this.url=url;15this.yxbz=yxbz,16}17/*省略getset*/18}以创建树结构的类MenuTree。完成递归并获得树结构。1importjava.util.ArrayList;2importjava.util.List;34publicclassMenuTree{5privateList<Menu>menuList=newArrayList<Menu˃();6publicMenuTree{7this.menuList=menuList;8}910/创建树结构11publicList<Menu<buildTree(){12List<Menu}treeMenus=newArrayNist<Menu>();13用于{14enuNode=buildChildTree;15treeMenus.add;16}17returntreeMenus;18} 1920//递归,为{24if{25chilMenus.add;26}27}28pNode创建子树结构21privateMenubuildChildTree{22List<Menu>chilMenu=newArrayList<Menu˃();23。setChildren;29返回节点;30}3132//获取根节点33privateList<Menu>getRootNode(){34List<Menu<rootMenuLists=newArrayList<Menu();35用于{36if{37rootMenuList.add;38}39}40 returnrootMenu列表;41}42}最后,插入一些数据以尝试效果。生成的json可以生成图1中的菜单。

  递归生成一个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。通过以下过程实现:

    1.首先从菜单数据中获取所有根节点。

    2.为根节点建立次级子树并拼接上。

    3.递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”。

JAVA递归生成树形菜单第1张

  首先,编写数据模型Menu。每条菜单有自己的id、父节点parentId、菜单名称text、菜单还拥有次级菜单children。

 1 import java.util.List;
 2 
 3 public class Menu {
 4     private String id;
 5     private String parentId;
 6     private String text;
 7     private String url;
 8     private String yxbz;
 9     private List<Menu> children;     
10     public Menu(String id,String parentId,String text,String url,String yxbz) {
11         this.id=id;
12         this.parentId=parentId;
13         this.text=text;
14         this.url=url;
15         this.yxbz=yxbz;   
16     }
17         /*省略getset*/  
18 }

  创建树形结构的类MenuTree。方法getRootNode获取所有根节点,方法builTree将根节点汇总创建树形结构,buildChilTree为节点建立次级树并拼接上当前树,递归调用buildChilTree不断为当前树开枝散叶直至找不到新的子树。完成递归,获取树形结构。

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class MenuTree {
 5     private List<Menu> menuList = new ArrayList<Menu>();
 6     public MenuTree(List<Menu> menuList) {
 7         this.menuList=menuList;
 8     }
 9 
10     //建立树形结构
11     public List<Menu> builTree(){
12         List<Menu> treeMenus =new  ArrayList<Menu>();
13         for(Menu menuNode : getRootNode()) {
14             menuNode=buildChilTree(menuNode);
15             treeMenus.add(menuNode);
16         }
17         return treeMenus;
18     }
19 
20     //递归,建立子树形结构
21     private Menu buildChilTree(Menu pNode){
22         List<Menu> chilMenus =new  ArrayList<Menu>();
23         for(Menu menuNode : menuList) {
24             if(menuNode.getParentId().equals(pNode.getId())) {
25                 chilMenus.add(buildChilTree(menuNode));
26             }
27         }
28         pNode.setChildren(chilMenus);
29         return pNode;
30     }
31 
32     //获取根节点
33     private List<Menu> getRootNode() {         
34         List<Menu> rootMenuLists =new  ArrayList<Menu>();
35         for(Menu menuNode : menuList) {
36             if(menuNode.getParentId().equals("0")) {
37                 rootMenuLists.add(menuNode);
38             }
39         }
40         return rootMenuLists;
41     }
42 }

  最后,插入一些数据试试效果。得到的json就可以生成图一菜单了。

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import com.alibaba.fastjson.JSON;
 4 
 5 public class Hello {
 6     public static void main(String []args) {
 7         List<Menu>  menuList= new ArrayList<Menu>();
 8         /*插入一些数据*/
 9         menuList.add(new Menu("GN001D000","0","系统管理","/admin","Y"));
10         menuList.add(new Menu("GN001D100","GN001D000","权限管理","/admin","Y"));
11         menuList.add(new Menu("GN001D110","GN001D100","密码修改","/admin","Y"));
12         menuList.add(new Menu("GN001D120","GN001D100","新加用户","/admin","Y"));
13         menuList.add(new Menu("GN001D200","GN001D000","系统监控","/admin","Y"));
14         menuList.add(new Menu("GN001D210","GN001D200","在线用户","/admin","Y"));
15         menuList.add(new Menu("GN002D000","0","订阅区","/admin","Y"));
16         menuList.add(new Menu("GN003D000","0","未知领域","/admin","Y"));
17         /*让我们创建树*/
18         MenuTree menuTree =new MenuTree(menuList);
19         menuList=menuTree.builTree();
20         /*转为json看看效果*/
21         String jsonOutput= JSON.toJSONString(menuList);
22         System.out.println(jsonOutput);
23     }
24 }

@luqp 本文地址:https://www.cnblogs.com/lucky-pin/p/10740037.html

免责声明:文章转载自《JAVA递归生成树形菜单》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PostgreSQL在Linux上的RPM和源码安装SQL 优化之该走索引却不走索引的分析(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Sql server --触发器

概念:   触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA...

C# 文件操作 全收录 追加、拷贝、删除、移动文件、创建目录、递归删除文件夹及文件....

本文收集了目前最为常用的C#经典操作文件的方法,具体内容如下:C#追加、拷贝、删除、移动文件、创建目录、递归删除文件夹及文件、指定文件夹下 面的所有内容copy到目标文件夹下面、指定文件夹下面的所有内容Detele、读取文本文件、获取文件列表、读取日志文件、写入日志文件、创建HTML 文件、CreateDirectory方法的使用C#追加文件Stream...

关于ASP.NET运行机制原理。。。个人总结

1.浏览器封装一个HTTP协议报文发送到服务器 2.服务器拿到请求后进行解析,若为HTML,CSS,JS等此类静态文件,则IIS直接进行查询,把文件封装后返回给客户端 3.①若请求为aspx,ashx等此类动态网页程序,IIS是处理不了的,IIS会交给自己的扩展AspNet_Isapi.dll,(其中I和S分别的代表intert ,serives),  ...

/ Vijos FBI树 递归

描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。 FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:1) T的根结点为R,其类型与串S的类型相同;2) 若串S的长度大于1,将串S...

[转] c++11 可变参数模板

  [转自 https://www.cnblogs.com/qicosmos/p/4325949.html] 1概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可...

[转载]Linux C编程-实现文件夹的递归拷贝

copy(读取的路径或名字,目标文件的路径或名字) {        if(读取的是一个文件夹)        {     创造一个文件夹              打开文件夹,读取文件夹的内容              判断是否是一个文件夹  是:递归copy(xx,xx);               否,说明是个文件,拷贝文件            ...