java递归处理单位组织机构树

  • 什么是递归?
  • 什么时候用递归呢?
  • 递归的注意事项!
  • 第一步首先封装组织部门数据
  • 第二步写Controller调用
  • 第三步打开postman测试一下成果
  • 下面总结一下递归的优缺点

什么是递归?

在说递归之前先说说栈(Stack)是什么?
一、栈(Stack)实现了一个后进先出(LIFO)的数据结构。
你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。

二、当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出,而递归算法就是利用了栈的线性结构实现的

一、递归算法是一种直接或间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解,还可以可以把复杂的事情变得简单。

二、递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)。

三、递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。递归其实就是在栈内存中不断的加载同一个函数。

什么时候用递归呢?

当一个功能被重复使用,而每一次使用该功能时的参数不确定,都由上次的功能元素结果来确定。

递归的注意事项!

一、必须有可最终达到的终止条件,否则程序将陷入无穷循环出现栈内2.存溢出错误(StackOverflowError);
二、子问题在规模上比原问题小,或更接近终止条件;
三、子问题可通过再次递归调用求解或因满足终止条件而直接求解;
四、子问题的解应能组合为整个问题的解。

第一步首先封装组织部门数据

public static List<Map<String, Object>> parseTree(List<Map<String, Object>> list) {List<Map<String, Object>> deptTreeList = new ArrayList<Map<String, Object>>(); // 拼装好的deptTreeListMap<String, Object> f_idMap = new HashMap<String, Object>();for (int i = 0, l = list.size(); i < l; i++) {f_idMap.put(String.valueOf(list.get(i).get("F_ID")), list.get(i));}for (int i = 0, l = list.size(); i < l; i++) {Map<String, Object> map = list.get(i);//f_idMap存储的均为F_ID为key的键值对,如果以F_PID为key可以取出对象,则表明该元素是父级元素if(f_idMap.get(map.get("F_PID")) != null && (map.get("F_ID") != map.get("F_PID"))){//给当前这个父级map对象中添加key为deptList的ArrayListif ((f_idMap.get(map.get("F_PID")) != null) && ((Map<String, Object>) f_idMap.get(map.get("F_PID"))).get("deptList") == null) {( (Map<String,Object>) f_idMap.get(map.get("F_PID")) ).put("deptList", new ArrayList<Map<String, Object>>());}Map<String, Object> tmap = (Map<String, Object>) f_idMap.get(map.get("F_PID"));ArrayList<Map<String, Object>> tArrayList = (ArrayList<Map<String, Object>>) tmap.get("deptList");tArrayList.add(list.get(i));//处理没有父节点} else {deptTreeList.add(list.get(i));}}return deptTreeList;}

第二步写Controller调用

如果不理解就多debug几次看程序是如何执行的。

@Controller
@RequestMapping("/dept")
public class DeptTreeController {//TODO 获取带人员组织部门树形结构@PostMapping("/getTreeDeptUser")public XmlServiceResult getTreeDeptUser() {XmlServiceResult result = new XmlServiceResult();List<Map<String, Object>> treeDeptList = new ArrayList();try (XmlServiceContext context = new XmlServiceContext()) {//获取单位集合(这个数据就是数据库查出来的,框架不同换成自己数据源就好)List deptList = DataUtil.getDataList(context, "sys_dept/getDeptList", "list");//拼装单位树形结构treeDeptList = DataUtil.parseTree(deptList);//获取用户集合(这个数据就是数据库查出来的,框架不同换成自己数据源就好)List userList = DataUtil.getDataList(context, "sys_user/getUserList", "userList");// 将单位树和用户集合调用tree方法进行递归拼装tree(treeDeptList, userList);result.getData().put("deptList", treeDeptList);}return result;}/*递归遍历组织机构,判断id相同填入数据*/public void tree(List<Map<String, Object>> deptListTree, List<Map<String, Object>> userList) {for (int i = 0; i < deptListTree.size(); i++) {Map <String,Object> deptMap = deptListTree.get(i);if (!CollectionUtils.isEmpty((List) deptMap.get("deptList"))) {List<Map<String, Object>> deptChildren = (List<Map<String, Object>>) deptMap.get("deptList");// 封装有子节点单位的数据List users =new ArrayList();for (Map userMap : userList) {if (deptMap.get("SID").equals(userMap.get("R_DEPT"))) { // 单位id(SID)和用户表中的单位id(R_DEPT)对应上则拼装users.add(userMap);}}deptListTree.get(i).put("userList",users);tree(deptChildren, userList); // 如果能够拿到单位集合说明下级还有单位则递归下级单位list} else {// 封装没有子节点单位数据List users =new ArrayList();for (Map userMap : userList) {if (deptMap.get("SID").equals(userMap.get("R_DEPT"))) {users.add(userMap);}}deptListTree.get(i).put("userList",users);}}}
}

第三步打开postman测试一下成果

下面总结一下递归的优缺点

递归好处:代码更简洁清晰,可读性更好
递归可读性好这一点,对于初学者可能会反对。实际上递归的代码更清晰,但是从学习的角度要理解递归真正发生的什么,是如何调用的,调用层次和路线,调用堆栈中保存了什么,可能是不容易。但是不可否认递归的代码更简洁。一般来说,一个人可能很容易的写出前中后序的二叉树遍历的递归算法,要写出相应的非递归算法就比较考验水平了,恐怕至少一半的人搞不定。所以说递归代码更简洁明了。
递归坏处:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住,所以在递归之前要考虑数据层级深度否则就栈内存溢出(StackOverflowError)。

java递归处理单位人员组织机构树相关推荐

  1. 【Vue入门实践】Element-UI 树形组件el-tree的组件封装 =>实现组织机构树Tree => 使用vue-content-menu定制可编辑树结构editableTree

    好吧吐槽一下,公司决定之后的技术栈都是vue了,我又从React转战回来了.干巴爹 好的生活方式,是和一群志同道合的人,一起奔跑在理想的路上!回头有一路的故事,低头有坚定的脚步,抬头有清晰的远方. 首 ...

  2. SQL递归查询实现组织机构树

    系统用到的组织机构树,要实现对当前节点以及其子节点的查询,数据库SQL要用到递归查询,这也是我第一次接触SQL的递归查询. 先说一下什么是递归查询,简单说来是将一个树状结构存储在一张表里,比如一个表中 ...

  3. java 递归查询组织机构树

    需求:不要在数据库层写存储过程或者调用数据库自带方法实现,因为数据库有可能是MySQL或者是oracle. 核心递归代码: /*** @Description: 递归查询机构 * @param @pa ...

  4. think in java interview-高级开发人员面试宝典(二)

    think in java interview-高级开发人员面试宝典(二) 分类: 面经2013-08-05 00:4318634人阅读评论(58)收藏举报 目录(?)[+] 从现在开始,以样题的方式 ...

  5. 122345 java_【每天算法2】:用java语言实现,一个组数:122345这6个数,打印出它所有可能的组合;要求4不能在第3位,3和5不能相连。 | 学步园...

    一个组数:122345这6个数,打印出它所有可能的组合:要求4不能在第3位,3和5不能相连. 我在实现这个 感觉我的算法复杂度还是挺高的.过程中,不断的创建新的数组列别. 如果你有更好的算法,请发上来 ...

  6. Java计算机毕业设计单位职工房产管理源码+系统+数据库+lw文档

    Java计算机毕业设计单位职工房产管理源码+系统+数据库+lw文档 Java计算机毕业设计单位职工房产管理源码+系统+数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...

  7. java计算机毕业设计社区人员管理系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计社区人员管理系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计社区人员管理系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构:B/S ...

  8. LeetCode 105 Construct Binary Tree from Preorder and Inorder Traversal-前序中序遍历构造二叉树-Python和Java递归解法

    题目地址:Construct Binary Tree from Preorder and Inorder Traversal - LeetCode Given preorder and inorder ...

  9. Java 递归解决 quot;仅仅能两数相乘的计算器计算x^yquot; 问题

    Java 递归解决 "仅仅能两数相乘的计算器计算x^y" 问题 /*** 求一个数的乘方* 求x^y,y是一个正整数. 设计算器仅仅能计算两数相乘,不能一次计算n个数相乘. * 知 ...

最新文章

  1. matlab绘制横向柱状图
  2. 【贪心】【字典树】Gym - 101466A - Gaby And Addition
  3. [Angularjs]过滤器
  4. openmp使用经验
  5. python爬取时怎么获取头部header
  6. 你真的了解Maven pom.xml 的配置吗?【详解maven pom】
  7. JavaScript:说看懂了就懂了闭包,看懂了,还是不懂...
  8. 【VRP】基于matlab禁忌搜索算法求解车辆路径规划问题【含Matalb源码 158期】
  9. Python与模块--01sys
  10. mdt 计算机名_配置 MDT 部署共享规则
  11. 项目质量监测(三)e2e test端到端测试——单元测试和端到端测试 e2e test工具-Cypress Nightwatch TeatCafe Codecov-测试结果可视化
  12. 腾讯会议 .wemta 文件如何转码成 mp4 文件
  13. 深度解密天猫精灵对话系统
  14. 重积分 | 第二类曲面积分投影法正负判断
  15. UE4像素流(Pixel Streaming)应用场景演示和分析
  16. 豆豆趣事[2016年03月]
  17. 运维开发面试题集锦(25k-35k)
  18. IOS开发之——动画-图标抖动(97)
  19. Python简单实现PageRank计算
  20. numpy.core._exceptions.MemoryError: Unable to allocate 167. MiB for an array with shape (2970, 2460,

热门文章

  1. 微信小程序详解 php,微信小程序canvas基础详解
  2. 什么时间吃nmn比较好,nmn服用产生效果和时间,请正确认识
  3. nginx 配置网站通用的伪静态代码
  4. SQL Server的错误日志
  5. 【经典收藏】深度技术ghost官方原版XP系统sp3下载地址 ...
  6. 计算机应用基础重难点介绍,计算机基础教学计划范文五篇
  7. 可怜的博主跟小豆人杠起来啦!Python制作的吃豆人小游戏,快来围观!!
  8. 【GNURadio实验报告】实验2-使用GNURadio仿真OOK信号
  9. docker load镜像报错:open /var/lib/docker/tmp/docker-import-525555606/repositories: no such file or direc
  10. 计算机拨打比赛策划书,电脑打字擂台赛活动策划书