用递归调用函数来把存在父子级别的数据封装成一个树状结构
对于菜单,以及省市区联动这种数据, 要从数据库取出来传给前端,然后前端通过ztree之类的框架进行展示,那么这里我写了一个将数据库中的数据,转成dto的树状结构的工具方法
代码
这里用了lombok框架,所以需要导lombok依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version></dependency>
这样只需要一个@Data注解就可以省去getter和setter了
idea还需要加一个插件LomBok plugin
1.数据库对应的实体类
package com.zgd.demo.entity;import lombok.Data;/*** 菜单* @author zgd*/
@Data
public class Menu {private Integer id;private String name;private Integer parentId;private Integer level;public Menu(Integer id, String name, Integer parentId, Integer level) {this.id = id;this.name = name;this.parentId = parentId;this.level = level;}
}
2. menu的dto类
package com.zgd.demo.dto;import lombok.Data;import java.util.List;/*** menu的dto类* @author zgd*/
@Data
public class MenuDto {private Integer id;private String name;private Integer parentId;private Integer level;private List<MenuDto> children;
}
4.工具类
package com.zgd.demo.util.bean;import com.zgd.demo.dto.MenuDto;
import com.zgd.demo.dto.UserDto;
import com.zgd.demo.entity.Menu;
import com.zgd.demo.entity.User;
import org.springframework.beans.BeanUtils;import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;/*** 将数据库查出来的list数据抓成树状结构* @author zgd*/
public class List2TreeUtil {/*** 根级父ID*/private static final Integer ROOT_PARENT_ID = 0;/*** 将普通的entity的集合转成存在树状结构的集合* @param list* @return*/public static List<MenuDto> getDtoTreeList(List<Menu> list){List<MenuDto> dtos = new ArrayList<>();if (list == null || list.isEmpty()) {return dtos;}for (Menu menu : list) {if (ROOT_PARENT_ID.equals(menu.getParentId())){//找到顶层目录MenuDto menuDto = new MenuDto();//将实体类的数据转成dtoBeanUtils.copyProperties(menu,menuDto);//获取该实体类下的所有子级dtos.add(findChildren(menuDto,list));}}return dtos;}/*** 获取dto类下面的所有子级,存到dto中的children中* @param menuDto* @param list* @return*/private static MenuDto findChildren(MenuDto menuDto, List<Menu> list) {for (Menu menu : list) {if (menuDto.getId().equals(menu.getParentId())){//此时menu是menuDto下的子级if (menuDto.getChildren() == null){menuDto.setChildren(new ArrayList<MenuDto>());}MenuDto dto = new MenuDto();BeanUtils.copyProperties(menu,dto);//递归menuDto.getChildren().add(findChildren(dto,list));}}return menuDto;}}
4.测试
package com.zgd.demo;import com.google.gson.Gson;
import com.zgd.demo.entity.Menu;
import com.zgd.demo.util.bean.List2TreeUtil;
import jdk.nashorn.internal.runtime.linker.LinkerCallSite;import java.util.ArrayList;
import java.util.List;/*** 运行demo* @author zgd*/
public class DemoTest {public static void main(String[] args) {Gson gson = new Gson();List<Menu> list = new ArrayList<>();list.add(new Menu(1,"顶级目录",0,1));list.add(new Menu(2,"二级目录-a",1,2));list.add(new Menu(3,"二级目录-b",1,2));list.add(new Menu(4,"三级目录-a-a",2,3));list.add(new Menu(5,"三级目录-a-b",2,3));list.add(new Menu(6,"三级目录-a-c",2,3));list.add(new Menu(7,"三级目录-b-a",3,3));System.out.println(gson.toJson(List2TreeUtil.getDtoTreeList(list)));}
}
将打印出来的字符串进行格式化后
用递归调用函数来把存在父子级别的数据封装成一个树状结构相关推荐
- python函数可以递归调用吗_递归调用函数
我有10张,20张,50张钞票,当我需要支付任何金额时,我需要找到最好的组合.例如,当我需要付7英镑时,我会付5英镑和2英镑的钞票 我有一个函数可以计算这个.但我需要运行同一个函数3到4次,如下所示. ...
- Java递归子集算法(树状结构)的逻辑和实例代码实现 @杨章隐
Java递归算法(树状结构)的逻辑和实例 1.应用场景: 递归算法作为一个经常使用的算法,无论在API开发还是计算文件夹都是比较常用的, 在api开发过程中我们经常遇到需要返回树状结构的json 例如 ...
- file类打印目录---树状结构,递归
package Test; import java.io.File; /** * file类打印目录---树状结构,递归 * @author Administrator * */ public cla ...
- Stream流实现Tree树状结构无限递归
Stream流实现Tree树状结构无限递归 场景:在使用mybatis plus操作多层数据格式,多层遍利操作影响数据查询效率 代码 例子:需要返回给前端多级菜单 省(直辖市)/市/区(县) /*** ...
- C语言,利用递归调用函数求年龄问题 问题描述:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3那个人大2岁。问第3个人多少岁,他说比第2个人大2岁。求5人年龄
代码如下: #include <stdio.h> int YearOld(int n); int main() {int n,i;for (i = 1; i <= 5; i++) { ...
- 用递归及非递归方式实现树状结构的遍历函数
1.递归方法: var tree = [{val: 1,children: [{val: 2,children: null},{val: 3,children: [{val: 4,children: ...
- ssm中java实现树状结构_java ssm使用递归写树形结构
实体类: private String dspId; private String parentId; //父类id private String dataName; private Integer ...
- oracle树状结构递归,Oracle:递归查询(树形结构数据)
Oracle树形结构数据-相关知识总结 Oracle树形结构数据--基本知识 1.数据组成 2.基本查询 2.1.查询某节点及该节点下的所有子孙节点 SELECT * FROM QIAN ...
- java File类 打印目录树状结构(递归)
import java.io.File;/*** 递归遍历**/ public class FieTree {public static void main(String[] args) {File ...
- java树状结构递归与非递归实现,外加sql递归实现
关于下列面出现的泛型自行修改 1.java8流式非递归实现 public Map<String, List<E>> selectCatalogue(int type, int ...
最新文章
- Microbiome:NGLess语言实现快速可重复分析宏基因组的流程NG-meta-profiler
- package main: read unexpected NUL in input
- 6.PHP与JavaScript交互
- Java开发必会的反编译知识
- Android binder 框架和学习资料
- 容器viewController添加或者删除子viewController
- C++提高部分_C++类模板与继承---C++语言工作笔记091
- vscode中安装webpack_leaflet-webpack 入门开发系列一初探篇(附源码下载)
- ImageButton 按钮查看商品详细信息
- 共享库方案解决WAS中JAR包冲突
- ce修改面板属性_鬼谷八荒ce教程 教你如何修改属性+灵石+物品+时间等方法
- 豆瓣已玩烂,来爬点有逼格的 ——IMDB 电影提升你的品位
- python代码求圆锥体积_计算圆锥体积的c++程序
- glassfish 配置 mysql_GlassFish MySql连接池配置 | 学步园
- 爬虫实战(三)----使用百度API获取经纬度/地址
- java中的switch case语句
- Maven系列之使用阿里云仓库
- 谈谈自己对微信商城的看法
- PHP安装包TS和NTS的区别-Centos7 LANMP环境搭建(最完善版本)
- 敏感电阻-----热敏电阻NTC的一些知识