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

{"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. Go语言defer详解
  2. FPGA(5)--VHDL--10十进制计数器及7段显示译码器
  3. 【好文链接】什么是开环控制?什么是闭环控制?区别在哪里?
  4. Ext Gantt Web甘特图--自定义任务树
  5. 监控摄像头接入流媒体服务器的几种方式
  6. php yii 锁,php – 使用Yii 2.0加密REST响应流
  7. NSA和CISA联合发布《5G云基础设施安全保护指南》
  8. Jim Marino与Meeraj Kunnumpurath专访:关于SCA和Fabric3
  9. .Net框架搭建之2、SQL Server MEF依赖注入 MVC Repository框架
  10. html给页面整体添加左右边距_css div 网页的页面边距怎么控制
  11. mysql 2002_解决MySQL报错ERROR 2002 (HY000)
  12. SQL反模式:实体-属性-值(EAV)问题(一)
  13. 编写程序,从键盘输入 一个 英文字母(有若干行)。如果是大写字母,则输出它对应的小写字母;如果是小写字母,则输出它对应的大写字母。
  14. vue嵌套路由,二级路由使用介绍
  15. ListView制作简单表格
  16. VOC2012数据集的探索性数据分析(EDA)
  17. 1758:二叉树——结点关系
  18. ASP.NET2.0里的web.config配置接口API(转)
  19. 判断浏览器是否为IE浏览器
  20. 关于MYSQL增量备份

热门文章

  1. asp.net987-超市会员管理系统#毕业设计
  2. 用JAVA写一个古诗生成器_简简单单用java写一个营销号话术生成器
  3. 华为防火墙配置目的nat
  4. unigui运行总是显示“正在装载”或Loading...
  5. Python SDK是什么
  6. 电场与磁场中的物理量
  7. 计算机分析建筑风,武汉城住宅小区风环境计算机模拟分析-图学学报.PDF
  8. 超详细excle入门教程!万字长文,图文详解!
  9. win764位不能改计算机名,win7 64位旗舰版系统无法修改MAC的原因和解决
  10. 如何让抖音上热门 修改视频md5值有什么用