项目中遇到一个接口,需要根据部门级别返回一个树状结构,包括部门,子部门,和部门下的员工,其结构如下:

{"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 通过使用递归函数实现树状结构相关推荐

  1. Java递归子集算法(树状结构)的逻辑和实例代码实现 @杨章隐

    Java递归算法(树状结构)的逻辑和实例 1.应用场景: 递归算法作为一个经常使用的算法,无论在API开发还是计算文件夹都是比较常用的, 在api开发过程中我们经常遇到需要返回树状结构的json 例如 ...

  2. java File类 打印目录树状结构(递归)

    import java.io.File;/*** 递归遍历**/ public class FieTree {public static void main(String[] args) {File ...

  3. excel转json (树状结构)

    excel转json (树状结构) 一.python读取excel 转json 目的:在于将excel的数据转换成json格式. import xlrd, jsondef read_xlsx_file ...

  4. java构建树状结构工具类

    树状结构工具 创建类TreeUtil 类属性 private List<T> rootList; //根节点对象存放到这里private List<T> bodyList; / ...

  5. JAVA树状结构数据处理

    文章目录 前言 一.数据库中的结构 二.查询步骤 1.XML 2.VO 3.树中插入叶子 总结 前言 在工作中遇到需要对树状结构的数据进行一个处理,通过本文做出一个分享和总结.本文对数据的查询主要是通 ...

  6. JAVA树状结构转List平面

    JAVA树状结构转List平面 使用递归实现 #主方法 A 实体, @ApiModel(value = "A", description = "信息") @Da ...

  7. 【java工具类】四级菜单如何实现树状结构展示JSON给前端

    前言: 主要是传给前端进行树状结构操作比较好,这样可以关联上下四级选择项,所以需要把表中的数据List转成一个树状结构. 1.数据库数据是静态的四级目录 数据是这样的四级目录,没有特别明确的id进行关 ...

  8. JAVA构建树状结构

    记一下自己在展示树状结构时候的几个写法,一个是确定有几个层级的,用于只有两三个层级的树状结构,写法简单一点.还有就是不确定有几个层级,也可能1个,也可能4个或者更多. 先说一下确定有几个层级的写法 这 ...

  9. Java处理数据成为树状结构

    如题所示,项目中需要将部分数据处理成为树状结构,实现过程如下: 注:也可以使用sql达到该目的,但此处数据不多,故在代码中处理,主要是sql处理不是很会 // 获取需要封装的数据List<Dat ...

最新文章

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

热门文章

  1. unity修改asset store及其他缓存位置
  2. Diskgenius修复硬盘0柱面坏道
  3. X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (一) 滤线栅的原理
  4. 区块链技术 英文(BlockChain Terminal)简称BCT ——区块链终端
  5. echo输出字符串显示不同颜色和背景色
  6. 《酷玩》——畅玩游戏,尽享应用,探索无限可能!
  7. mysql中聚集索引和非聚集索引区别
  8. 西门子PLC动态加密催款程序
  9. 工字型钢弹性截面模量计算公式_型钢计算公式2
  10. MATLAB experiment<6>