当前位置: 首页 > news >正文

部门树生成 双重for循环代替递归 java

部门树生成 双重for循环代替递归

介绍

业务问题:生成部门树。

第一思路是递归的方式,获取当前部门的所有子部门,接着再去递归子部门。但其实使用for循环也可以做到。

代码:

    private List<DeptNode> generateTree(List<Dept> list) {

        List<DeptNode> nodes = new ArrayList<>(20);
        for (Dept dept : list) {
            DeptNode deptNode = new DeptNode();
            BeanUtils.copyProperties(dept, deptNode);
            nodes.add(deptNode);
        }
        for (DeptNode deptNode : nodes) {
            for (DeptNode child : nodes) {
                if (child.getPid().intValue() == deptNode.getId().intValue()) {
                    List<DeptNode> children = deptNode.getChildren();
                    if (children == null) {
                        children = Lists.newArrayList();
                        deptNode.setChildren(children);
                    }
                    children.add(child);
                }
            }
        }
        List<DeptNode> result = new ArrayList<>(20);
        for (DeptNode node : nodes) {
            if (node.getPid().intValue() == 0) {
                result.add(node);
            }
        }
        return result;


    }

先将所有部门查出放入到一个列表,接着两次for循环这个列表,在循环中给部门设置每个部门的children子部门。循环完成后,所有的部门的子部门children都已经设置完成。

最后再次循环整个部门列表,只取顶级部门,不直接展示子部门,因为子部门已经被设置到了顶级部门的children中(或者children的children…),所以不需要重复展示。

问题

这种两次for循环方式也有问题。

假如说只需要某部门的子部门,如果使用上面这种方式就要循环所有的部门,把所有部门设置完子部门放入列表后,再从这个列表根据id找到所需要的部门。

而如果使用递归,只需要传入该部门的id,程序就可以先获取该部门的子部门,再根据子部门递归下去。

如果感觉不到区别,考虑极端情况,1000个部门都是顶级部门,要查某部门的子部门信息,两次for循环要100万次,递归只需要1次。

所以要看业务情况使用。

相关文章:

  • java 统计各个单词出现的次数,忽略大小写
  • java 中文路径FileNotFoundException
  • csdn 领域优质创作者图标获取方式
  • clearInterval无效的一种原因
  • No Identifier specified for entity 的解决办法
  • Java使用Jxls 导入导出Excel
  • 表格thead设置border无效的原因之一
  • th:href中出现变量
  • css 只显示一行 超出用...表示
  • thymeleaf 设置时间格式
  • 小程序 真机调试Unhandled promise rejection page not found
  • js判断移动设备 分辨率
  • safari遮罩无效
  • jquery获取style
  • jquery切换display
  • 网络传输文件的问题
  • 自己简单写的 事件订阅机制
  • 「译」Node.js Streams 基础
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • ng6--错误信息小结(持续更新)
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Vue官网教程学习过程中值得记录的一些事情
  • 关于使用markdown的方法(引自CSDN教程)
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 强力优化Rancher k8s中国区的使用体验
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 自动记录MySQL慢查询快照脚本
  • 带你开发类似Pokemon Go的AR游戏
  • ​flutter 代码混淆
  • $.ajax()方法详解
  • (Java数据结构)ArrayList
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (区间dp) (经典例题) 石子合并
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转)fock函数详解
  • (转)http-server应用
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • @property括号内属性讲解
  • @ResponseBody
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [android学习笔记]学习jni编程
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [echarts] y轴不显示0
  • [hdu 3652] B-number
  • [Head First设计模式]策略模式
  • [iOS]让Xcode 4.2生成的app支持老的iOS设备(armv6)
  • [LeetCode]: 145: Binary Tree Postorder Traversal
  • [LLM][FT]大模型Fine-Tuning相关技术0