list列表转tree树方法
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树方法的更多相关文章
- Tree( 树) 组件[4]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...
- Tree( 树) 组件[3]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 事件列表很多事件的回调函数都包含'node'参数, ...
- Tree( 树) 组件[1]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件. 一. 加载方式//class 加载方式<ul c ...
- JQuery Easy Ui (Tree树)详解(转)
第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在j ...
- 数据网格和树-EasyUI Datagrid 数据网格、EasyUI Propertygrid 属性网格、EasyUI Tree 树、EasyUI Treegrid 树形网格
EasyUI Datagrid 数据网格 扩展自 $.fn.panel.defaults.通过 $.fn.datagrid.defaults 重写默认的 defaults. 数据网格(datagrid ...
- 第二百二十六节,jQuery EasyUI,Tree(树)组件
jQuery EasyUI,Tree(树)组件 本节课重点了解 EasyUI 中 Tree(树)组件的使用方法,这个组件依赖于 Draggable(拖 动)和 Droppable(放置)组件. 一.加 ...
- Tree( 树) 组件[2]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 异步加载如果想从数据库里获取导航内容, 那么就必须 ...
- .net easyui Tree树
原文:https://www.cnblogs.com/hantianwei/archive/2012/03/19/2407118.html Tree 树 用 $.fn.tree.defaults ...
- PHP函数可变参数列表的具体实现方法介绍
PHP函数可变参数列表可以通过_get_args().func_num_args().func_get_arg()这三个函数来实现.我们下面就对此做了详细的介绍. AD:2014WOT全球软件技术峰会 ...
随机推荐
- Codeforces Round #585 (Div. 2) D. Ticket Game
链接: https://codeforces.com/contest/1215/problem/D 题意: Monocarp and Bicarp live in Berland, where eve ...
- springAop,注解annotation + redis 实现分布式锁
当前流行的系统,就是分布式系统.所谓分布式,我个人理解,是很多的服务分布在不同的机器上,都是相同功能模块.但是容易出现一个问题,就是并发时的问题. 我们传统的锁,只能锁住一个服务器上的方法,让其在一个 ...
- 浏览器顶部设置margin-top时存在的bug
浏览器bug<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...
- 爬取淘宝商品数据并保存在excel中
1.re实现 import requests from requests.exceptions import RequestException import re,json import xlwt,x ...
- AtCoder Beginner Contest 142【D题】【判断素数的模板+求一个数的因子的模板】
D - Disjoint Set of Common Divisors Problem Statement Given are positive integers AA and BB. Let us ...
- JVM相关面试
来源:老码农 ,lingsui.github.io/2018/03/30/JVM面试题/ 1.你知道哪些或者你们线上使⽤什么GC策略?它有什么优势,适⽤于什么场景? 参考 触发JVM进行Full ...
- tree/pstree
tree yum install tree 不指定路径的话直接显示当前目录的结构 加上-L 表示只显示到指定的目录层级 tree -L 2 ./
- [Luogu] 被污染的河流
https://www.luogu.org/problemnew/show/P3875 线段树扫描线求矩形面积并 扫描线的线段树有点奇怪,修改的标记不会下传,标记的意义是当前区间被完整地覆盖了多少次, ...
- 【概率论】3-7:多变量分布(Multivariate Distributions Part I)
title: [概率论]3-7:多变量分布(Multivariate Distributions Part I) categories: Mathematic Probability keywords ...
- pymysql基本使用
导入模块 import pymysql 连接(看一下password有没有,没有的话会怎么样,有很多参数,有些参数也是可以不传的) conn = pymysql.connect(user = &quo ...