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 ...
最新文章
- vim替换字符串带斜杠_Vim、gvim操作替换
- c 实现 php 数组,C语言实现数组功能
- java jstack dump 线程 介绍 解释
- SLAM-ch2-cmake中使用库
- 1、HTML 初步认识
- nginx.conf配置详解
- 精通Spring Boot——第十一篇:使用自定义配置
- 新建maven写页面_使用 IDEA 创建 Maven Web 项目 (三)- 编写一个简单的 WEB 应用
- python关于包的题怎么做_Python自定义包引入
- vue-resource.js的get和post的正确用法
- Boost.Asio的网络编程
- Xcode安装及卸载
- gulp之gulp-uglify模块
- android使用Charles抓包https请求
- nginx 部署前端项目
- 汉语语言分析(2) - 短语
- numpy抽样函数 np.random.choice用法详解
- 虚拟机安装及网络配置
- 网站死链接检测查询工具
- 咻咻验证码,见证百合网发展壮大!