list转tree递归转换

/**
* 递归遍历节点
* @param sourceList
* @param parentCode
* @return
*/
public List<Office> findChildrenList(List<Office> sourceList, String parentCode) {
List<Office> treeList = new ArrayList<>();
//获取到所有parentCode的子节点
for(Office item:sourceList) {
if (parentCode.equals(item.getParentCode())) {
treeList.add(item);
//递归遍历该子节点的子节点列表
item.setChildList(this.findChildrenList(sourceList,item.getOfficeCode()));
}
} return treeList;
}

假设有列表有n个元素要组成一颗树,时间复杂度为O(n2), 每次递归都会创建一个treeList对象,空间复杂度为O(n)

这个递归可能当数据量太大时会造成方法栈内存溢出,不是很想使用这个方法。

双重for循环转tree(改进)

    /**
* 部门列表数据转换成树结构
* 一次性把所有根节点获取到,然后再获取
*
* @param list
* @param parentCode
* @return
*/
public List<Office> convertTree(List<Office> list, String parentCode) {
List<Office> trees = new ArrayList<>();
for (Office item : list) {
//获取到根节点
if (parentCode.equals(item.getParentCode())) {
trees.add(item);
}
       //遍历获取所有节点下的子节点数据,去除子节点列表中的重复数据
for (Office it : list) {
if (it.getParentCode().equals(item.getId())) {
if (item.getChildList() == null) {
item.setChildList(new ArrayList<Office>());
}
boolean isPut = true;
for (Office childItem : item.getChildList()) {
if (it.getOfficeCode().equals(childItem.getOfficeCode())) {
isPut = false;
}
}
if (isPut) {
item.getChildList().add(it);
} }
}
}
return trees;
}

上面双重for循环,总的来及应该算三重for循环,最外层循环的作用是,获取到根节点为parentCode的字节点作为树字节的root树根节点。

还有一个作用是,遍历所有节点的子节点列表,

第二层for循环就是用来查找节点的字节点。

而第三层循环是用来去去除子节点列表中的重复数据。因为当List<Office> list是被缓存到内存中时,再次将这个list数据进行树转换就会造成子节点数据重复

参考资料

java list 转树 tree 的三种写法:https://blog.csdn.net/jcroad/article/details/79735790#commentBox

list列表转tree树方法的更多相关文章

  1. Tree( 树) 组件[4]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...

  2. Tree( 树) 组件[3]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 事件列表很多事件的回调函数都包含'node'参数, ...

  3. Tree( 树) 组件[1]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件. 一. 加载方式//class 加载方式<ul c ...

  4. JQuery Easy Ui (Tree树)详解(转)

    第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在j ...

  5. 数据网格和树-EasyUI Datagrid 数据网格、EasyUI Propertygrid 属性网格、EasyUI Tree 树、EasyUI Treegrid 树形网格

    EasyUI Datagrid 数据网格 扩展自 $.fn.panel.defaults.通过 $.fn.datagrid.defaults 重写默认的 defaults. 数据网格(datagrid ...

  6. 第二百二十六节,jQuery EasyUI,Tree(树)组件

    jQuery EasyUI,Tree(树)组件 本节课重点了解 EasyUI 中 Tree(树)组件的使用方法,这个组件依赖于 Draggable(拖 动)和 Droppable(放置)组件. 一.加 ...

  7. Tree( 树) 组件[2]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 异步加载如果想从数据库里获取导航内容, 那么就必须 ...

  8. .net easyui Tree树

    原文:https://www.cnblogs.com/hantianwei/archive/2012/03/19/2407118.html Tree 树   用 $.fn.tree.defaults ...

  9. PHP函数可变参数列表的具体实现方法介绍

    PHP函数可变参数列表可以通过_get_args().func_num_args().func_get_arg()这三个函数来实现.我们下面就对此做了详细的介绍. AD:2014WOT全球软件技术峰会 ...

随机推荐

  1. 极光推送出现 超时问题:Connect timeout. Please retry later. Error:7

    检查之后均没有什么太大的问题, 最后发现出现77这种错误码,有一种可能就是系统的ca包没有更新 包名为 ca-certificates 使用命令 yum install ca-certificates ...

  2. rabbitmq 持久化 事务 发送确认模式

    部分内容来自:http://blog.csdn.net/hzw19920329/article/details/54315940 http://blog.csdn.net/hzw19920329/ar ...

  3. Mac: ld: library not found for -lgcc_s.10.4

    Mac: ld: library not found for -lgcc_s.10.4   Checking for cc... ld: library not found for -lgcc_s.1 ...

  4. 17、生命周期-BeanPostProcessor在Spring底层的使用

    17.生命周期-BeanPostProcessor在Spring底层的使用 bean赋值.注入其他组件.@Autowired注解.生命周期注解.@Async --都是 BeanPostProcesso ...

  5. 二进制文件方式安装kubernetes集群

    所有操作全部用root使用者进行,高可用一般建议大于等于3台的奇数,我们使用3台master来做高可用 练习环境说明: 参考GitHub master: kube-apiserver,kube-con ...

  6. PHP mysqli_error_list() 函数

    返回最近调用函数的最后一个错误代码: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("localhos ...

  7. 007_STM32程序移植之_多通道ADC转换

    1. 测试环境:STM32C8T6 2. 测试:使用DMA进行多通道ADC转换 3. 描述:用 ADC 连续采集 12 路模拟信号,并由 DMA 传输到内存.ADC 配置为扫描 并且连续转换模式,AD ...

  8. luogu 2114 [NOI2014]起床困难综合症 位运算+贪心

    感觉这个思路非常巧妙啊~ code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s&qu ...

  9. C语言学习笔记10-结构体、枚举、联合体

    C语言学习笔记10-结构体.枚举.联合体    待传

  10. python ros 设置机器人的位置

    #!/usr/bin/env python import rospy import math from tf import transformations from geometry_msgs.msg ...