Java 通过使用递归函数实现树状结构
项目中遇到一个接口,需要根据部门级别返回一个树状结构,包括部门,子部门,和部门下的员工,其结构如下:
{"code": 0,"data": [{"nodeId": 0,"label": "第一级部门","choiced": 0,"children": [{"nodeId": 1,"label": "第二级部门","choiced": 1,"children": [{"nodeId": 2,"label": "第三级部门","choiced": 0,"children": []},{"nodeId": 3,"label": "第二级部门的人员","choiced": 1}]}]}]
}
仔细分析一下,每一级的结构基本都相同,有"nodeId","label","choiced"这三个基本的信息,需要注意的是,部门有"children"字段,即子部门,而员工没有这个字段。
难点分析:
这个结构的难点一个在于我们不知道这个部门的结构有几层,普通的循环无法实现这个功能,需要使用递归。另一个难点就是这个结构的children既有部门又有员工,但员工的数据结构与部门的结构又不太一样。
实现思路:
使用递归的方式遍历部门列表数据,首先获得所有一级部门,然后在每个一级部门,去查找该部门下的二级部门和该部门下的员工......。最底层员工层我们可以写一个父类,然后部门去继承这个类并添一个children属性。
实现方法:
父类NodeVo:
public class NodeVo {//省略get/set方法private Integer node_id;private String label;private Integer choiced;
}
子类AuthTreeVo:
public class AuthTreeVo extends NodeVo{//省略get/set方法private List<NodeVo> children;
}
实现类AuthTree:
构造方法:根据业务需求传参
public AuthTree(List<PersonWithDept> personList,List<PersonWithDept> personAuthList, List<Department> departmentList, List<Department> departmentAuthList){this.personList = personList;this.personAuthList = personAuthList;this.departmentList = departmentList;this.departmentAuthList = departmentAuthList;}
获取所有一级部门:getRootNode()
public List<Department> getRootNode(){List<Department> departments = new ArrayList<>();for(Department department:departmentList){if(department.getParentId().equals(0)){departments.add(department);}}return departments;}
实现树状结构的方法:makeTree()
public List<AuthTreeVo> makeTree(){List<AuthTreeVo> authTreeVos = new ArrayList<>();for(Department department:getRootNode()){AuthTreeVo authTreeVo = new AuthTreeVo();authTreeVo.setNode_id(department.getDepartmentId());authTreeVo.setLabel(department.getDepartmentName());authTreeVo=loopTree(department);authTreeVos.add(authTreeVo);}return authTreeVos;}
递归方法:loopTree()
public AuthTreeVo loopTree(Department department){AuthTreeVo authTreeVo = new AuthTreeVo();authTreeVo.setNode_id(department.getDepartmentId());authTreeVo.setLabel(department.getDepartmentName());authTreeVo.setChoiced(0);for(Department authDepartment: departmentAuthList) {if (authDepartment.getDepartmentId().equals(department.getDepartmentId())) {authTreeVo.setChoiced(1);break;}}List<NodeVo> authTreeVos = new ArrayList<>();for(Department departmentChild:departmentList){if(departmentChild.getParentId().equals(department.getDepartmentId())){authTreeVos.add(loopTree(departmentChild));}}for(PersonWithDept person: personList){if(person.getDepartmentId().equals(department.getDepartmentId())){NodeVo nodeVo = new NodeVo();nodeVo.setNode_id(person.getPersonId());nodeVo.setLabel(person.getName());nodeVo.setChoiced(0);for(PersonWithDept authPerson:personAuthList){if(authPerson.getPersonId().equals(person.getPersonId())){nodeVo.setChoiced(1);break;}}authTreeVos.add(nodeVo);}}authTreeVo.setChildren(authTreeVos);return authTreeVo;}
Java 通过使用递归函数实现树状结构相关推荐
- Java递归子集算法(树状结构)的逻辑和实例代码实现 @杨章隐
Java递归算法(树状结构)的逻辑和实例 1.应用场景: 递归算法作为一个经常使用的算法,无论在API开发还是计算文件夹都是比较常用的, 在api开发过程中我们经常遇到需要返回树状结构的json 例如 ...
- java File类 打印目录树状结构(递归)
import java.io.File;/*** 递归遍历**/ public class FieTree {public static void main(String[] args) {File ...
- excel转json (树状结构)
excel转json (树状结构) 一.python读取excel 转json 目的:在于将excel的数据转换成json格式. import xlrd, jsondef read_xlsx_file ...
- java构建树状结构工具类
树状结构工具 创建类TreeUtil 类属性 private List<T> rootList; //根节点对象存放到这里private List<T> bodyList; / ...
- JAVA树状结构数据处理
文章目录 前言 一.数据库中的结构 二.查询步骤 1.XML 2.VO 3.树中插入叶子 总结 前言 在工作中遇到需要对树状结构的数据进行一个处理,通过本文做出一个分享和总结.本文对数据的查询主要是通 ...
- JAVA树状结构转List平面
JAVA树状结构转List平面 使用递归实现 #主方法 A 实体, @ApiModel(value = "A", description = "信息") @Da ...
- 【java工具类】四级菜单如何实现树状结构展示JSON给前端
前言: 主要是传给前端进行树状结构操作比较好,这样可以关联上下四级选择项,所以需要把表中的数据List转成一个树状结构. 1.数据库数据是静态的四级目录 数据是这样的四级目录,没有特别明确的id进行关 ...
- JAVA构建树状结构
记一下自己在展示树状结构时候的几个写法,一个是确定有几个层级的,用于只有两三个层级的树状结构,写法简单一点.还有就是不确定有几个层级,也可能1个,也可能4个或者更多. 先说一下确定有几个层级的写法 这 ...
- Java处理数据成为树状结构
如题所示,项目中需要将部分数据处理成为树状结构,实现过程如下: 注:也可以使用sql达到该目的,但此处数据不多,故在代码中处理,主要是sql处理不是很会 // 获取需要封装的数据List<Dat ...
最新文章
- Go语言defer详解
- FPGA(5)--VHDL--10十进制计数器及7段显示译码器
- 【好文链接】什么是开环控制?什么是闭环控制?区别在哪里?
- Ext Gantt Web甘特图--自定义任务树
- 监控摄像头接入流媒体服务器的几种方式
- php yii 锁,php – 使用Yii 2.0加密REST响应流
- NSA和CISA联合发布《5G云基础设施安全保护指南》
- Jim Marino与Meeraj Kunnumpurath专访:关于SCA和Fabric3
- .Net框架搭建之2、SQL Server MEF依赖注入 MVC Repository框架
- html给页面整体添加左右边距_css div 网页的页面边距怎么控制
- mysql 2002_解决MySQL报错ERROR 2002 (HY000)
- SQL反模式:实体-属性-值(EAV)问题(一)
- 编写程序,从键盘输入 一个 英文字母(有若干行)。如果是大写字母,则输出它对应的小写字母;如果是小写字母,则输出它对应的大写字母。
- vue嵌套路由,二级路由使用介绍
- ListView制作简单表格
- VOC2012数据集的探索性数据分析(EDA)
- 1758:二叉树——结点关系
- ASP.NET2.0里的web.config配置接口API(转)
- 判断浏览器是否为IE浏览器
- 关于MYSQL增量备份
热门文章
- asp.net987-超市会员管理系统#毕业设计
- 用JAVA写一个古诗生成器_简简单单用java写一个营销号话术生成器
- 华为防火墙配置目的nat
- unigui运行总是显示“正在装载”或Loading...
- Python SDK是什么
- 电场与磁场中的物理量
- 计算机分析建筑风,武汉城住宅小区风环境计算机模拟分析-图学学报.PDF
- 超详细excle入门教程!万字长文,图文详解!
- win764位不能改计算机名,win7 64位旗舰版系统无法修改MAC的原因和解决
- 如何让抖音上热门 修改视频md5值有什么用