码迷,mamicode.com
首页 > 其他好文 > 详细

使用Map辅助拼装树状结构,消除递归调用

时间:2014-09-26 13:29:18      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   使用   ar   for   数据   sp   

目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储。
使用时全部查询出来,然后在内存中拼装成树状结构。现在主要涉及的是拼装方法的问题。

一般可以进行 递归调用来实现 过程如下:
1.首先找到根节(s)点即没有上级节点的元素 
2.根据找到的节点的id,遍历数据,查看parentid为此id的元素 将其 放到此元素的childlist中去
3.对此元素的childlist 重复步骤2

2-3这个步骤的重复 一般通过递归来实现。


我采用的方法,是使用map作为辅助,只做一层循环,但增加判断条件
这个方法之前在别的地方也有用过,不过没有记录下来。

节点类:

1 class Node{
2 String nodeNo;
3 String parentNodeNo;
4 Set<Node> childNodes;
5 }

 



方法直接贴代码
 

 1        //数据源为sourceList  此时所有的ChildNodes里都是空的 并没有被拼成树状
 2 List<Node> listToTree(List <Node> sourceList){ 
 3         //1.先准备一个数组 用于存储根节点(s)  准备一个Map用于存储节点的子元素列表
 4 
 5         List<Node> rootNodes= new ArrayList<Node>();
 6         Map<String, Set<Node>> childNodesMap= new HashMap<String, Set<Node>>();
 7 
 8         //2.唯一的一层循环 
 9         for (Node node: sourceList) {
10             //3.查看Map中是否有子此Node的子元素列表 没有则创建
11             if (childNodesMap.get(node.getNodeNo()) == null) {
12                 childNodesMap.put(privilege.getNodeNo(), new HashSet<Node >());
13             }
14             //4.将childNodes赋值给此Node 
15             node.setChildre(childNodesMap.get(node.getNodeNo()));
16             //5.如果此Node是根Node则放到根列表中去
17             if (node.getParentNodeNo() == null) {
18                 rootNodes.add(node);
19             }
20             if (node.getParentNodeNo() != null) {
21                  //6.查看此Node的ParentNode的 ChildNodes是否存在 没有则创建
22                 if (childNodesMap.get(node.getParentNodeNo()) == null) {
23                     childNodesMap.put(node.getParentNodeNo(), new HashSet<Node >());
24                 }
25                 //7.将此节点 添加到ParentNodes的ChildNodes中
26                 childNodesMap.get(node.getParentNodeNo()).add(node);
27             }
28         }
29         return rootNodes;
30 } 

 

使用Map辅助拼装树状结构,消除递归调用

标签:des   style   blog   color   使用   ar   for   数据   sp   

原文地址:http://www.cnblogs.com/laoniu85/p/3994419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!