使用Map辅助拼装树状结构,消除递归调用
目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储。
使用时全部查询出来,然后在内存中拼装成树状结构。现在主要涉及的是拼装方法的问题。
一般可以进行 递归调用来实现 过程如下:
1.首先找到根节(s)点即没有上级节点的元素
2.根据找到的节点的id,遍历数据,查看parentid为此id的元素 将其 放到此元素的childlist中去
3.对此元素的childlist 重复步骤2
2-3这个步骤的重复 一般通过递归来实现。
我采用的方法,是使用map作为辅助,只做一层循环,但增加判断条件
这个方法之前在别的地方也有用过,不过没有记录下来。
节点类:
class Node{
String nodeNo;
String parentNodeNo;
Set<Node> childNodes;
}
方法直接贴代码
//数据源为sourceList 此时所有的ChildNodes里都是空的 并没有被拼成树状
List<Node> listToTree(List <Node> sourceList){
//1.先准备一个数组 用于存储根节点(s) 准备一个Map用于存储节点的子元素列表 List<Node> rootNodes= new ArrayList<Node>();
Map<String, Set<Node>> childNodesMap= new HashMap<String, Set<Node>>(); //2.唯一的一层循环
for (Node node: sourceList) {
//3.查看Map中是否有子此Node的子元素列表 没有则创建
if (childNodesMap.get(node.getNodeNo()) == null) {
childNodesMap.put(privilege.getNodeNo(), new HashSet<Node >());
}
//4.将childNodes赋值给此Node
node.setChildre(childNodesMap.get(node.getNodeNo()));
//5.如果此Node是根Node则放到根列表中去
if (node.getParentNodeNo() == null) {
rootNodes.add(node);
}
if (node.getParentNodeNo() != null) {
//6.查看此Node的ParentNode的 ChildNodes是否存在 没有则创建
if (childNodesMap.get(node.getParentNodeNo()) == null) {
childNodesMap.put(node.getParentNodeNo(), new HashSet<Node >());
}
//7.将此节点 添加到ParentNodes的ChildNodes中
childNodesMap.get(node.getParentNodeNo()).add(node);
}
}
return rootNodes;
}
使用Map辅助拼装树状结构,消除递归调用的更多相关文章
- java File类 打印目录树状结构(递归)
import java.io.File; /** * 递归遍历 * */ public class FieTree { public static void main(String[] args) { ...
- js List<Map> 将偏平化的数组转为树状结构并排序
数据格式: [ { "id":"d3e8a9d6-e4c6-4dd8-a94f-07733d3c1b59", "parentId":&quo ...
- 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示
树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...
- java集合树状结构及源码
java集合树状结构及源码 最近一直想看一下java集合的源码,毕竟平时用的比较多,但总是感觉是跟着习惯new出来一个对象,比如ArrayList,HashMap等等,所以就简单的看了一下,了解了一下 ...
- 将lits集合转化为树状结构
一,bean的类型: public class DeptListRES { /** * 子节点 */ private List<DeptListRES> children; private ...
- openerp学习笔记 对象间关系【多对一(一对一)、一对多(主细结构)、多对多关系、自关联关系(树状结构)】
1.多对一(一对一)关系:采购单与供应商之间的关系 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, sta ...
- 原生JS实现树状结构列表
树状结构列表,这个技术点之前有写过了,是基于vue讲解,但似乎都没有解决痛点,最基础的原生JS该怎么实现呢? 这篇文章会全面详细的介绍树状结构列表的实现,从数据处理成树状结构,到动态生成dom节点渲染 ...
- 根据租户id获取部门树状结构有父子结构的数据list
/** * 根据租户id获取部门树状结构 * @param tenantId * @return */ @GetMapping("getDeptTreeList") public ...
- 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限
大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...
随机推荐
- UIImage的使用
UIImage是IOS中层级比较高的一个用来加载和绘制图像的一个类,更底层的类还有CGImage,以及IOS5.0以后新增加的CIImage.今天我们主要聊一聊UIImage的三个属性: imageO ...
- 【17】以独立语句将newed对象置入智能指针
1.为什么? 考虑下面的情况:方法声明为void processWidget(shared_ptr<Widget> pw,int priority). 调用方法 processWidget ...
- JAVA编程心得-多态设计初步
面向对象的思想中,封装,继承,多态作为特性会在开发中广泛应用,一个健壮的系统除了功能强大以外,它的可扩展性应该也很强,多态恰好应用了这个思路. 下面我以杨小聪去某地的方式为例,我们知道首先杨小聪要去某 ...
- CRF++使用小结(转)
1. 简述 近期要应用CRF模型,进行序列识别.选用了CRF++工具包,详细来说是在VS2008的C#环境下,使用CRF++的windows版本号.本文总结一下了解到的和CRF++工具包相关的信息. ...
- android89 服务service
#服务 服务不能new,new出来的只是一个普通java对象不是服务,只能够通过Intent和startService(intent)创建服务. ###开启方式 * startService,onCr ...
- iostat详解
http://www.penglixun.com/tech/system/use_iostat_analyse_linux_disks.html
- Big Clock
Problem Description Our vicar raised money to have the church clock repaired for several weeks. The ...
- Android应用程序所包含的四种组件和DDMS
关注用户组件 Activity 编辑文本 .玩游戏 后台进程 Service ...
- Verilog HDL常用的行为仿真描述语句
一.循环语句 1.forever语句 forever语句必须写在initial模块中,主要用于产生周期性波形. 2.利用for.while循环语句完成遍历 for.while语句常用于完成遍历测试.当 ...
- 读取group by 之外的字段
序号 姓名 性别 身高 1 张三 男 185 2 李四 女 161 3 王五 女 166 4 赵六 男 178 1.获取男生女生人数 select count(性别) , 性别 from 表名 ...