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

目前菜单或其他树状结构在数据库中的存储,多数是以一个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 } 
时间: 2024-10-29 19:08:37

使用Map辅助拼装树状结构,消除递归调用的相关文章

java File类 打印目录树状结构(递归)

import java.io.File; /** * 递归遍历 * */ public class FieTree { public static void main(String[] args) { File f = new File("D:/java笔记"); printFile(f,0); } static void printFile(File file,int level){ for(int i=0;i<level;i++){ System.out.print(&quo

js List&lt;Map&gt; 将偏平化的数组转为树状结构并排序

数据格式: [ { "id":"d3e8a9d6-e4c6-4dd8-a94f-07733d3c1b59", "parentId":"6d460008-38f7-479d-b6d1-058ebc17dae3","myorder":1, "name":"任务一" }, { "id":"6d460008-38f7-479d-b6d1-058e

树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:parent_id) 三.Java模型 (我们把这张网撒在html的一张表里.其实用ul来展示会简单N多,自己思考为什么LZ会选择放在表里) private class Table {        private Long id; // 当前对象的id         private int x; /

系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构

系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这个实体有关联关系. 3,每个实体中都有什么属性? 1,主键.推荐使用代理主键 2,关联关系属性.在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性.有几个端指向本类,本类中就有几个关联关系属性. 3,一般属性.分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等.

Day03处理上级部门(树状结构)和用户管理

系统管理:部门管理-处理上级部门 添加或者修改时,上级部门的格式如图:.解决此功能将面临两个问题:1.将所有部门名称以下拉选的形式展示出来2.以树状结构展示.在此我们先解决问题1. 在添加页面中展示所有部门名称,并完成添加功能 DepartmentAction: public String addUI() throws Exception { //准备数据 List<Department> departmentList = departmentService.findAll(); Action

树状结构组装

后台数据组装 /** * 查询权限列表 * @param categoryId * @return */ @Override public List<Map<String, Object>> getMenus(String categoryId) { List<Map<String, Object>>menuallist= userDao.selectMenuAllList(); List<String> meunSelectedList = n

Android无限级树状结构

通过对ListView简单的扩展.再封装,即可实现无限层级的树控件TreeView. 1 package cn.asiontang.nleveltreelistview; 2 3 import android.annotation.TargetApi; 4 import android.content.Context; 5 import android.os.Build; 6 import android.util.AttributeSet; 7 import android.view.View

在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构

将实体绑定到TreeView控件,实现树状结构的显示,如下图所示.这个功能通过HierarchicalDataTemplate实现. ? 1. 业务实体 作为举例,我定义了一个大家都很熟悉的Folder类型,即文件夹.我们都知道,文件夹又可以包含子文件夹,而且可以多层嵌套.所以,这是一个递归的结构体. public class Folder { public string Name { get; set; } public ObservableCollection<Folder> Folder

c# 递归、树状结构

1.树状结构 treeView.Nodes.Clear(); TreeNode tree = new TreeNode(); tree.Text = "字母"; treeView.Nodes.Add(tree); // tree.Nodes.Add("A"); TreeNode tree1 = new TreeNode(); tree1.Text = "汉字"; treeView.Nodes.Add(tree1); TreeNode a = ne