我们在展示一个机构树的时候,经常会遇到这种一个问题,查询数据的时候,是从下往上查的,但展示数据的时候,又要从下往上展示。

这时候就要把查询到的数据进行整理从而得到我们想要的结构。

举个样例。

ID PARENT_ID SOME_ATTRIBUTE_ID
2001 0  
6292 6120 57010
6120 6115  
6121 6115  
6156 6121 56874
6115 2001  

这是依据需求查询出的sql数据。可是它是无序的,所以非常让人头疼,不知怎样去处理,示意图是这种。

我们先明白下数据结构吧。

每个节点我们使用一个Map存储内容,key-value映射例如以下。

key value
ID String
Parent_ID String
Attribute_id String
Children List<Map>

children用来储存它的子节点的Map。

同一时候须要说明的是,我们的原始数据就是一个乱序的List<Map>,map中包括前三项内容。

最简单的办法就是有几层就遍历几次List。第一次遍历整个List,查找PID为0的节点,新建空的List放入Map中。这次遍历我们拿到2001这个节点,并把这个节点从List中清除。

第二次遍历,查找PID为2001的节点,这次我们查到6115这个节点。依次类推。遍历四次。我们就依照层次结构形成了须要的数据。

可是这样效率不好,有没有办法能遍历一次就完毕数据的整理工作呢?

看我把代码贴出来:

<span style="white-space:pre">		</span>List<Map> list = getList();
Map all = new HashMap();
for(int i = 0;i<list.size();i++){
Map result = list.get(i);
String parent_id = (String) result.get("PARENT_ID");
String id = (String) result.get("ID");
if(all.get(parent_id) == null){
Map temp = new HashMap();
List tempList = new ArrayList();
if(all.get(id) != null){
((Map)all.get(id)).putAll(result);
}else{
result.put("children", new ArrayList());
all.put(id, result);
}
tempList.add(all.get(id));
temp.put("children", tempList);
all.put(parent_id, temp);
}else{
if(all.get(id) == null){
result.put("children", new ArrayList());
all.put(id, result);
}else{
((Map)all.get(id)).putAll(result);
}
((List)((Map)all.get(parent_process)).get("children")).add(result);
}
}

少了遍历,就要多加入逻辑。

list是我们查询的内容,我们遍历list的时候,每拿到一条。就查看在all中。是否已经存在key为parent_id的对象,假设没有,我们再看有没有key为id的对象,假设有。它一定是作为parent_id时被建立的,所以我们把其它的内容加进去,假设没有,我们就在现有的result基础上,加入key为children的list,并把它以id为key保存在all中。同一时候。再新建一个以parent_id为key的对象,当中包括children为key的List。里边包括了key为id的对象。

假设以parent_id为key的对象在all中存在。那就简单了,仅仅须要查看all中是否有以id为key的对象,有直接将其加入至parent_id为key的对象中。没有的话。建立它,再把它放进去。

逻辑上确实比較复杂,也不是非常好理解。总之我们是在all中保存了全部以不论什么一个节点为顶节点的树,仅仅须要遍历一遍,整个all中的东西都能被整理完毕。

每次做到类似的问题的时候,都非常懊悔上大学的时候对acm嗤之以鼻。

事实上如今还是有点嗤之以鼻。。。。

我认为这根本不叫算法啊。数学模型才叫算法啊。

。。。

求醍醐灌顶!

另外本文求更优的解法。尤其是学过acm的童鞋的批评。

无限层级且乱序的树形结构数据的整理,利用HashMap降低遍历次数的更多相关文章

  1. java中实现无限层级的树形结构

    本文展示了两个实现方法的代码.两个代码的实现方法不同,代码2更为简单. 先看一下最后实现的结果: 最后结果-json 代码1: 实现过程: 1.传入一段json字符串 2.将字符串转换成对象存入节点列 ...

  2. js treeData 树形数据结构 无限层级(转载)

    js实现无限层级树形数据结构(创新算法) 转载:https://blog.csdn.net/Mr_JavaScript/article/details/82817177 由于做项目的需要,把一个线性数 ...

  3. 构建树形结构数据(全部构建,查找构建)C#版

    摘要: 最近在做任务管理,任务可以无限派生子任务且没有数量限制,前端采用Easyui的Treegrid树形展示控件. 一.遇到的问题 获取全部任务拼接树形速度过慢(数据量大约在900条左右)且查询速度 ...

  4. 简单叨叨bootstrap按钮无限层级下拉菜单的实现

    0.写在前面的话 最近看书都懈怠了,又正值新项目,虽说并不是忙得不可开交,好吧我老实交待,我就是偷懒了其实,博客也没更.言归正传,对于前端的不熟悉现在确实是个让我头疼的事情,以至于一些功能要在网络上漫 ...

  5. 树形结构数据存储方案的选择和java list转tree

    树形结构数据存储方案 Adjacency List:每一条记录存parent_idPath Enumerations:每一条记录存整个tree path经过的node枚举Nested Sets:每一条 ...

  6. Oracle树形结构数据-相关知识总结

    Oracle树形结构数据--基本知识 1.数据组成 2.基本查询 2.1.查询某节点及该节点下的所有子孙节点 SELECT   *      FROM QIANCODE.TREE_TABLE_BASI ...

  7. Oracle树形结构数据---常见处理情景

    Oracle树形结构数据---常见处理情景 1.查看表数据结构 SELECT *      FROM QIANCODE.TREE_HIS_TABLE T  ORDER BY T.NODE_LEVEL; ...

  8. Php无限层级并显示层级数

    今天在处理递归无限层级菜单时,遇到一个稍微烧脑的问题,如何显示当前节点所在的层级数.废话不多说,我们先看个直观的无限层级: <?php // 这里的arr是直接从数据库取出的,仅作为测试数据 $ ...

  9. 海边拾贝-G-若干有用的文章(乱序,经常更新)

    若干有用的文章,乱序版本.会经常性修改.     若干Python模块的介绍不错 https://www.cnblogs.com/sui776265233/category/1239819.html ...

随机推荐

  1. (收藏)KMP算法的前缀next数组最通俗的解释

    我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...

  2. HDoj-1527-取石子游戏

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  3. Swift主题色顶级解决方案一

    一.常规主题色使用点 应用在发布前都会对其主题色进行设置,以统一应用的风格(可能有多套主题).在主题色设置上有几个方面,如下: 1.TabBar部分,设置图片高亮.文本高度颜色 2.Navigatio ...

  4. c 中有关打印*,字符的题目集

    #include<stdio.h> //1.打印* void priStar() { printf("输入一个整数\n"); int num; scanf(" ...

  5. js实现无限级树形导航列表

  6. java 简单的数据增删该查

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...

  7. levelDB跳表实现

    跳表的原理就是利用随机性建立索引,加速搜索,并且简化代码实现难度.具体的跳表原理不再赘述,主要是看了levelDB有一些实现细节的东西,凸显自己写的实现不足之处. 去除冗余的key template& ...

  8. Minimum Window Substring @LeetCode

    不好做的一道题,发现String Algorithm可以出很多很难的题,特别是多指针,DP,数学推导的题.参考了许多资料: http://leetcode.com/2010/11/finding-mi ...

  9. 仿爱乐透android客户端界面实现(附工程源码)

    最近研究了爱乐透android客户端的界面,感觉它的界面布局在一般开发中具有代表性.难点在于复杂的布局实现. 界面实现主要采用了以下方式: 注意:版本支持:android2.2以上,低版本要改动源码哦 ...

  10. String "+" 的补充说明---行粒度

    String 中“+” 的操作的补充说明 在使用“+”的时候,会创建一个StringBuilder对象,然后invokevirtual append()操作 “+”操作创建StringBuilder的 ...