JAVA递归生成树形菜单



本文转载自:https://www.cnblogs.com/lucky-pin/p/10740037.html

这篇文章写得很好,解决了我的一个需求问题。

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

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

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

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

JAVA递归生成树形菜单

首先,编写数据模型Menu。每条菜单有自己的id、父节点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 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*/
}

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

import java.util.ArrayList;
import java.util.List;

public class MenuTree {
    private List menuList = new ArrayList();
    public MenuTree(List menuList) {
        this.menuList=menuList;
    }

    //建立树形结构
    public List builTree(){
        List treeMenus =new  ArrayList();
        for(Menu menuNode : getRootNode()) {
            menuNode=buildChilTree(menuNode);
            treeMenus.add(menuNode);
        }
        return treeMenus;
    }

    //递归,建立子树形结构
    private Menu buildChilTree(Menu pNode){
        List chilMenus =new  ArrayList();
        for(Menu menuNode : menuList) {
            if(menuNode.getParentId().equals(pNode.getId())) {
                chilMenus.add(buildChilTree(menuNode));
            }
        }
        pNode.setChildren(chilMenus);
        return pNode;
    }

    //获取根节点
    private List getRootNode() {
        List rootMenuLists =new  ArrayList();
        for(Menu menuNode : menuList) {
            if(menuNode.getParentId().equals("0")) {
                rootMenuLists.add(menuNode);
            }
        }
        return rootMenuLists;
    }
}

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

import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;

public class Hello {
    public static void main(String []args) {
        List  menuList= new ArrayList();
        /*插入一些数据*/
        menuList.add(new Menu("GN001D000","0","系统管理","/admin","Y"));
        menuList.add(new Menu("GN001D100","GN001D000","权限管理","/admin","Y"));
        menuList.add(new Menu("GN001D110","GN001D100","密码修改","/admin","Y"));
        menuList.add(new Menu("GN001D120","GN001D100","新加用户","/admin","Y"));
        menuList.add(new Menu("GN001D200","GN001D000","系统监控","/admin","Y"));
        menuList.add(new Menu("GN001D210","GN001D200","在线用户","/admin","Y"));
        menuList.add(new Menu("GN002D000","0","订阅区","/admin","Y"));
        menuList.add(new Menu("GN003D000","0","未知领域","/admin","Y"));
        /*让我们创建树*/
        MenuTree menuTree =new MenuTree(menuList);
        menuList=menuTree.builTree();
        /*转为json看看效果*/
        String jsonOutput= JSON.toJSONString(menuList);
        System.out.println(jsonOutput);
    }
}

Original: https://www.cnblogs.com/miaoying/p/14804670.html
Author: miaoying
Title: JAVA递归生成树形菜单

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538012/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot + websocket 实现模拟设备上下线

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年9月22日
    0190
  • EVE-NG 安装和使用过程中出现的问题

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    026
  • 1.阿里云MAVEN 2.腾讯MAVEN 3.华为MAVEN 4.网易MAVEN

    > >nexus-tencentyun</id> >*</mirrorOf> >Nexus tencentyun</name&…

    Java 2023年6月16日
    021
  • c#反射优化

    https://www.cnblogs.com/xinaixia/p/5777886.html https://www.cnblogs.com/xinaixia/p/5777961…

    Java 2023年5月30日
    032
  • Java初步使用

    java 目前属于甲骨文, 长期支持版本为 java8 和 java11, 主要学习JavaEE (Java Enterprise Edition) 企业版java特性: 强类型 …

    Java 2023年6月7日
    034
  • 日常踩坑_添加了@Transactional注解后,事务不生效

    故事梗概 事情是这样的,在使用Jpa的saveAll方法的时候,发现saveAll方法会进行先查询后保存的操作,但我只想要保存,不想要查询关于saveAll的重写 可以这样用 @P…

    Java 2023年6月7日
    029
  • springboot系列十三、springboot集成swaggerUI

    一、Swagger介绍 Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速…

    Java 2023年5月30日
    031
  • Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式

    Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式 Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式 – …

    Java 2023年6月7日
    0105
  • 创建对象时类的调用顺序

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年10月10日
    0362
  • 内网穿透工具之FRP

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年10月13日
    0162
  • Spring Boot 使用 Log4j2

    Java 中比较常用的日志工具类,有 Log4j、SLF4j、Commons-logging(简称jcl)、Logback、Log4j2(Log4j 升级版)、Jdk Loggin…

    Java 2023年5月30日
    036
  • Opencv环境配置及踩坑

    Opencv环境配置及踩坑 1.什么是Opencv OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows…

    Java 2023年6月7日
    033
  • tomcat指定运行jdk版本

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年9月23日
    0182
  • 深入Synchronized各种使用方法

    在Java当中synchronized通常是用来标记一个方法或者代码块。在Java当中被synchronized标记的代码或者方法在同一个时刻只能够有一个线程执行被synchron…

    Java 2023年6月8日
    032
  • tomcat参数java_opts调整

    在windows环境下,tomcat下的~/bin/catalina.bat文件,在文件头部加入: set “JAVA_OPTS=%JAVA_OPTS% -server -Xms5…

    Java 2023年5月29日
    029
  • Java中private、protected、public和default的区别

    public: 具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。 protected: 主要…

    Java 2023年5月29日
    039
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球