Java 无限级递归树形菜单

2023-11-06


递归生成一个树状json ,需要提供一个数据模型Sys Dept和建立树形结构的TreeNodeUtils。

  1. 首先获取所有节点的父节点。
  2. 递归创建父节点下的子节点树,并拼接。
  3. 递归子节点建立次子节点并拼接上,直至末端。

建立数据模型SysDept

public class SysDept {
    /**
     * Column: dept_id
     * Type: BIGINT
     * Remark: 部门id
     */
    private Long deptId;

    /**
     * Column: parent_id
     * Type: BIGINT
     * Default value: 0
     * Remark: 父部门id
     */
    private Long parentId;

    /**
     * Column: dept_name
     * Type: VARCHAR(30)
     * Remark: 部门名称
     */
    private String deptName;

//    子节点
    private List<SysDept> children;
    }

创建数据库表

create table `ry-vue`.sys_dept
(
    dept_id     bigint auto_increment comment '部门id'
        primary key,
    parent_id   bigint      default 0   null comment '父部门id',
    ancestors   varchar(50) default ''  null comment '祖级列表',
    dept_name   varchar(30) default ''  null comment '部门名称',
    order_num   int(4)      default 0   null comment '显示顺序',
    leader      varchar(20)             null comment '负责人',
    phone       varchar(11)             null comment '联系电话',
    email       varchar(50)             null comment '邮箱',
    status      char        default '0' null comment '部门状态(0正常 1停用)',
    del_flag    char        default '0' null comment '删除标志(0代表存在 2代表删除)',
    create_by   varchar(64) default ''  null comment '创建者',
    create_time datetime                null comment '创建时间',
    update_by   varchar(64) default ''  null comment '更新者',
    update_time datetime                null comment '更新时间'
)
    comment '部门表' engine = InnoDB;
INSERT INTO `sys_dept` VALUES (100,0,'0','若依科技',0,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(101,100,'0,100','深圳总公司',1,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(102,100,'0,100','长沙分公司',2,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(103,101,'0,100,101','研发部门',1,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(104,101,'0,100,101','市场部门',2,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(105,101,'0,100,101','测试部门',3,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(106,101,'0,100,101','财务部门',4,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(107,101,'0,100,101','运维部门',5,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(108,102,'0,100,102','市场部门',1,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(109,102,'0,100,102','财务部门',2,'若依','15888888888','ry@qq.com','0','0','admin','2022-03-18 13:44:40','',NULL),(110,0,'','中软国际',0,NULL,NULL,NULL,'0','0','',NULL,'',NULL),(111,110,'','青岛分公司',0,NULL,NULL,NULL,'0','0','',NULL,'',NULL);

建立树形结构工具类

import com.example.demo.model.SysDept;
import java.util.ArrayList;
import java.util.List;

public class TreeNode {

    // 建立父节点树形结构
    public List<SysDept> buildTree(List<SysDept> depts){
        ArrayList<SysDept> sysDepts = new ArrayList<>();
        for (SysDept sysDept : getNodeTree(depts)) {
            getChildrenNode(depts, sysDept);
            sysDepts.add(sysDept);
        }
        return sysDepts;
    }
    // 查询所有的父节点,getParent()=0
    private List<SysDept> getNodeTree(List<SysDept> depts){
        ArrayList<SysDept> sysDepts = new ArrayList<>();
        for (SysDept dept : depts) {
            if (dept.getParentId()==0){
                sysDepts.add(dept);
            }
        }
        return sysDepts;
    }

    // 递归建立树形子节点,将子节点放到父节点下
    private SysDept getChildrenNode(List<SysDept> depts,SysDept sysDept){
        ArrayList<SysDept> sysDepts = new ArrayList<>();
        for (SysDept dept : depts) {
            if (dept.getParentId().equals(sysDept.getDeptId())){
                sysDepts.add(getChildrenNode(depts,dept));
            }
        }
        sysDept.setChildren(sysDepts);
        return sysDept;
    }
}

测试

import com.example.demo.mapper.SysDeptMapper;
import com.example.demo.model.SysDept;
import com.example.demo.node.TreeNode;
import net.minidev.json.JSONArray;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SpringNodeApplicationTests {

    @Autowired
    private SysDeptMapper sysDeptMapper;
    @Test
    void contextLoads() {

        List<SysDept> sysDepts = sysDeptMapper.selectSysDept();
        TreeNode treeNode = new TreeNode();
        List<SysDept> sysDepts1 = treeNode.buildTree(sysDepts);
        String s = JSONArray.toJSONString(sysDepts1);
        System.out.println(s);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 无限级递归树形菜单 的相关文章

  • 如何在itext中设置自定义颜色?

    感谢您花时间回答我的问题 我正在使用 Java 中的 iText 生成 PDF 文档 我需要将表的列标题设置为与值列中的颜色不同的颜色 我有来自 Photoshop 的颜色十六进制值 我正在使用带有块和段落的 PdfPTable 除了 Ba
  • java字符串索引越界异常

    从类中调用函数时出现以下错误 java lang StringIndexOutOfBoundsException 字符串索引超出范围 1 尽管我使用系统打印来查看我在 substring 函数中传递的输入 但一切似乎都是正确的 函数 isC
  • while循环内的递归,它是如何工作的?

    你能告诉我这段java代码是如何工作的吗 public class Main public static void main String args Strangemethod 5 public static void Strangemet
  • Spring MVC 应用程序可以是多线程的,即使它的 servlet 不是吗?

    当您谈论 Spring 应用程序是多线程时 您是否一定是指该应用程序中定义的 servlet 是否是多线程的 或者即使应用程序中的 servlet 不是多线程 Spring 应用程序也可以配置为多线程吗 不再支持单线程 servlet 它们
  • 如何使用 Java 本机接口将字节数组传递到以 char* 作为参数的 C 函数中?

    所以我需要使用JNI从java调用C函数 当传入不同的数据类型 创建本机变量 头文件 共享库等等 时 我已经能够成功地做到这一点 但无法让它与字节数组一起使用 这是我的 C 函数 include
  • Powermockito 可以在非最终具体类中模拟最终方法吗?

    假设我有一个非最终具体类 具有如下所示的最终方法 public class ABC public final String myMethod return test test 可以嘲笑吗myMethod 调用时返回其他内容junit usi
  • CXF 客户端异常:{XXX} 的拦截器已引发异常,现在展开

    我遇到以下 CXF 异常 warning Interceptor for http example com wsdl esc 2011 12 12 AmazonEC2 http example com wsdl esc 2011 12 12
  • 无法获取未知属性“运行时”Gradle 7.0

    我最近切换到 gradle 7 0 现在无法构建我的项目 jar 并出现错误 无法获取 org gradle api internal artifacts configurations DefaultConfigurationContain
  • 如何跨工作区保存 E​​clipse 启动配置文件?

    当我复制 Eclipse 项目目录时 它包含 classpath 和 project 文件 这样当我将同一目录带到另一个 Eclipse 实例时 我不必设置我的构建路径等 假设所有资源都包含在在项目中 而不是外部 但是 此过程不会导致启动配
  • 在 Android 上解析 RSS

    我有几个 RSS 源需要为我的应用程序进行解析 我按照这里的优秀教程进行操作 http w2davids wordpress com android rssatom feeds parsing with rome http w2davids
  • Spring 在 AuthenticationSuccessHandler 中自动装配会话范围 bean 不起作用

    我正在使用 spring security 我想初始化一个对象User在用户成功登录后的会话中 安全配置如下 Configuration EnableWebSecurity PropertySource classpath configs
  • 使用 Gradle 构建 Kotlin + Java 9 项目

    我对 Gradle 老实说 还有 Java 9 相当陌生 我正在尝试使用 Gradle 构建一个混合了 Java 9 和 Kotlin 的简单库项目 更详细地说 Java中有一个接口 Kotlin中有一个实现 我会用 Kotlin 做所有事
  • 在 Scala 中创建 Java 对象

    我有一个 Java 类 Listings 我在 Java MapReduce 作业中使用它 如下所示 public void map Object key Text value Context context throws IOExcept
  • IntelliJ 对于 Java 项目使用的默认构建过程是什么?

    直接从 IntelliJ 中的 IDE 构建 Java 项目非常好 它速度很快 而且很有效 我无法找到任何有关 IntelliJ 如何进行这些默认构建的文档 我猜它使用Ant 我想做的是为下载我的项目的任何人自动化这个快速 轻松的构建过程
  • java代码的等效vb代码

    谁能告诉我这段Java代码到底做了什么 SecureRandom random SecureRandom getInstance SHA1PRNG byte bytes new byte 20 synchronized random ran
  • Maven 依赖冲突:org.w3c.dom.ElementTraversal

    我有一个 Java 代码库 它使用 Maven 进行依赖项解析并在 CI 上运行测试 经过最近的一批开发 大到足以很难识别重大更改 我的一些测试现在在通过 Maven 运行时失败了NoClassDefFoundError for org w
  • 如果使用 Maven,是否应该忽略 VCS 中 Eclipse 特定的文件?

    我知道为什么不将 Eclipse IDE 特定的文件提交到像 Git 我实际上正在使用的 这样的 VCS 中 这就是我使用 Maven 并让它为您生成这些文件的原因之一not将它们置于版本控制之下 但我想知道 是否应该在 gitignore
  • 访问 JAR 资源

    我有一个jar包含我想要分发的资源 主要是缓存 日志记录等配置 的文件 我对这些资源的相对路径有问题 所以我做了我在另一个 stackoverflow 问题中发现的问题 该问题说这是一种有效的方法 ClassInTheSamePackage
  • Selenium 查看鼠标/指针

    有什么方法可以在运行测试时真正看到硒鼠标吗 要么是 Windows 光标图像 要么是某种点或十字线或任何东西 我正在尝试使用拖放功能selenium and java in an HTML5Web 应用程序 并且能够看到光标以了解它实际在做
  • 如何在 Hibernate 中使用 SELECT 进行 INSERT

    我需要在休眠中实现以下请求 insert into my table max column values select max id from special table where 如何在休眠中使用注释来做到这一点 Special tab

随机推荐

  • openssl基本原理及生成证书

    openssl基本原理及生成证书 openssl基本原理及生成证书 1 基本原理 2 生成证书 一 生成CA证书 1 创建私钥 2 创建证书请求 3 自签署证书 4 将证书导出成浏览器支持的 p12格式 二 生成server证书 1 创建私
  • 6套粒子群算法(内含matlab代码)

    粒子群算法 1 粒子群算法简介 一 粒子群算法的历史 粒子群算法源于复杂适应系统 Complex Adaptive System CAS CAS理论于1994年正式提出 CAS中的成员称为主体 比如研究鸟群系统 每个鸟在这个系统中就称为主体
  • 【C#】如何比较两个对象是否相等(重写Equals方法)

    问题 写单元测试时 需要对比两个对象是否相等 如果使用Assert AreEqual mockclass1 class1 永远无法通过 原因 这里使用了object默认的Equals方法 必须要引用同一个对象 才会返回true 默认的Equ
  • 485通讯与MODBUS的区别与联系

    最近做智能检测的项目 设备 串口之间的通讯比较多 一会儿485 一会儿modbus RTU 有点晕了 这里重新梳理一下RS485 485通讯协议 ModBus通讯协议 Modbus Rtu通讯这几个点的联系和区别 先说RS485吧 RS48
  • C++面试之const和static的联系和区别

    C 中的静态成员和静态函数的参考之前写的博客 C 中的静态成员和静态函数 Littlehero 121的博客 CSDN博客 C 中的全局变量和普通全局变量参考之前写的博客 全局变量 静态全局变量 静态局部变量和普通局部变量的区别 Littl
  • 003 Leaflet 第三个demo 地图上的面积测量

    一 使用到的文件 leaflet src js Leaflet Editable js leaflet measure path js leaflet css leaflet measure path css 面积测量区别于拉框测量面积而言
  • 125-Linux_守护进程

    文章目录 1 什么是Linux守护进程 2 如何创建Linux守护进程 切换当前工作目录到根目录 这样可以避免守护进程在其它目录中的文件被占用 使用fork 函数创建子进程 并在父进程中退出 在子进程中调用setsid 函数创建新的会话组
  • VScode配置PHP运行环境

    VS code配置PHP环境 第一步 配置了PHP环境 如果没有配置php环境的请见上篇个文章 点我 第二步 你需要有VS code 第三步 配置settings json 我们按下shift ctrl p然后搜索settings json
  • 百度联盟百青藤app流量变现

    app流量变现
  • 静态数据成员和静态成员函数(static)

    目录 一 关于静态成员 二 静态数据成员和普通数据成员的共同点 三 为什么要使用静态数据成员 四 关于静态数据成员的初始化 五 静态成员的访问方式 六 静态成员函数 1 与静态数据成员不同 静态成员函数的作用不是为了对象之间的沟通 而是为了
  • Chinchilla Scaling Laws

    Chinchilla Scaling Laws是一组经验原则 用于指导神经网络模型中参数数量的选择和所需训练数据的数量 以实现最佳性能 这些原则表明 为了使模型达到最佳性能 参数数量应与训练集的大小成正比 而训练集的大小应与参数数量的平方成
  • Daniel and Spring Cleaning【数位DP】【Codeforces 1245 F】

    Codeforces Round 597 Div 2 F 这道题化简一下就是让我们求有上下限的2进制数中有几对满足每一位的相 值不为1的对数 那么 首先看到这个1e9就会让人想到数位DP 然后接着就是如何去求的这样一个问题 我们不如将上下限
  • Java8的stream().map()用法

    在Java编码过程中可能会遇到这个场景 遍历一个列表 对列表中的属性进行转换 赋值等操作形成我们想要的一个新列表 通常我们的常规思路就是直接使用for循环 在Java8引入lambda表达式后我们可以使用stream流链式处理的方式 形成新
  • Android之R文件

    首先了解什么是R文件 当 Android 应用程序被编译 会自动生成一个 R 类 其中包含了所有 res 目录下资源 包括布局文件layout 图片文件drawable等 具体的内容如下所示 public final class R 全是以
  • 力扣题---单值二叉树

    题目链接 单值二叉树 先来看下题目与例题 如果二叉树每个节点都具有相同的值 那么该二叉树就是单值二叉树 只有给定的树是单值二叉树时 才返回 true 否则返回 false 示例 1 输入 1 1 1 1 1 null 1 输出 true 示
  • CSV文件在Python中的处理方式

    一 使用Python基本语法读写CSV文件 使用基本语法读取CSV文件中的数据大概思路是 获取文件对象 读取表头 按逗号分隔符拆分表头字段 使用for循环语句获取表体记录数据 拆分后再次写入另一张CSV文件中 如果要将数据写入xls 格式的
  • java怎么复制别人的数据库_java – 在不同数据库之间复制数据(两者都支持jdbc)...

    我想将测试数据库 mysql 中的所有数据复制到生产数据库 hsqldb 我使用了hibernate 让它在我的数据库中创建表 所以结构 架构是相同的 使用mysql dump我可以在两个mysql数据库之间复制数据 但在我的情况下 数据库
  • css选择器

    4 2 CSS选择器 4 属性选择器 Attribute Selectors 2008年05月8日 4 2 CSS选择器 1 通配选择器 类型选择器与ID选择器 4 2 CSS选择器 2 类选择器与包含选择器 4 2 CSS选择器 3 子元
  • 千兆路由器怎么设置网速最快_如何设置路由器使网速最快

    有些时候我们自己家路由器的网速达不到办理宽带时的要求 通讯商又说那边没有问题 改怎么办呢 其实我们可以设置一下路由器进行加快网速 下面是学习啦小编整理的设置路由器网速最快的方法 供您参考 设置路由器网速最快的方法 在浏览器里输入路由器IP地
  • Java 无限级递归树形菜单

    文章目录 建立数据模型SysDept 创建数据库表 建立树形结构工具类 测试 递归生成一个树状json 需要提供一个数据模型Sys Dept和建立树形结构的TreeNodeUtils 首先获取所有节点的父节点 递归创建父节点下的子节点树 并