简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树
第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树。
  本篇,换一种方式。
好处是:不维护节点的深度level,增加和修改节点时,也不用维护。递归实现,代码比较清晰。
  坏处是:节点较多的时候,性能可能不够好。不能直接查询到节点的深度level。当然,如果需要level字段,在递归过程中,是可以计算得到的。关于在递归过程中,计算level,后面有介绍这种方法。
关于树的遍历和查找,大家都有基础,上面描述了一些总体思路,代码中有注释,基本就不用再详细介绍了。
//不维护节点的深度level,通过递归构造树
	public static List<Map<String, Object>> buildTree(
			List<Map<String, Object>> list) {
		//目标树
		List<Map<String, Object>> treeList = new ArrayList<Map<String, Object>>();
		//所有的顶级节点
		List<Map<String, Object>> rootList = TreeMenuUtil.findTopLevelNodeList(list);
		//所有的非顶级节点
		List<Map<String, Object>> notRootList = TreeMenuUtil.findNotRootList(list);
		//遍历顶级节点
		for (Map<String, Object> root : rootList) {
			// 构造子结点
			buildChildList(root, notRootList);
			//把根节点放到集合中
			treeList.add(root);
		}
		return treeList;
	}
	// 为一个“root节点,这个地方的root指有孩子的节点”
	private static void buildChildList(Map<String, Object> rootNode,
			List<Map<String, Object>> notRootList) {
		Integer acl =  MapUtils.getInteger(rootNode, "acl");
		for (Map<String, Object> notRoot : notRootList) {
			//从非顶级节点中,为当前节点寻找子结点
			boolean equals =  MapUtils.getInteger(notRoot, "parent_acl").equals(acl);
			if (equals) {
				List<Map<String, Object>> list = (List<Map<String, Object>>) rootNode
						.get("children");
				if (list == null) {
					list = new ArrayList<Map<String, Object>>();
					rootNode.put("children", list);
				}
				list.add(notRoot);
				//递归,为当前节点构造子结点
				buildChildList(notRoot, notRootList);
			}
		}
	}
原文首发:http://fansunion.cn/article/detail/572.html
简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树的更多相关文章
- 简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)
		本篇介绍的方法,参考了网上的代码.在递归过程中,计算level,是受到了这种方法的启发. CSDN上有篇关于树的算法,目标是把一个无序的树,变成有序的. 我看了下代码,并运行了下,感觉是可行的. 我 ... 
- 简洁常用权限系统的设计与实现(五):不维护节点的深度level,手动计算level,构造树
		这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与 ... 
- 简洁常用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法
		权限系统,Web开发常见标准子系统之一.结合自己的一些思考和实践,从本篇开始权限系统的设计与实现之路. 最近,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇,只是大致介绍下这个 ... 
- 简洁常用权限系统的设计与实现(三):维护和利用节点的深度level,迭代实现树的构造
		如果在节点的属性中,增加一个level属性,即树的深度,构造树会非常容易.前提是,增加和修改节点的时候,要维护level. 根节点的level为1,下一级为2,以此类推. 构造树的方法,主要有2个: ... 
- 设计与实现简单而经常使用的权限系统(四):无需维护level,递归构建树
		第三篇中.我们通过维护节点的深度level,通过迭代全部的节点,仅仅须要一次,就构造了树. 本篇.换一种方式. 优点是:不维护节点的深度level,添加和改动节点时,也不用维护.递归实现,代码比較清 ... 
- 简洁经常使用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法
		权限系统.Web开发常见标准子系统之中的一个.结合自己的一些思考和实践,从本篇開始权限系统的设计与实现之路. 近期,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇.仅仅是大致介 ... 
- 基于资源的权限系统-API设计
		概述 权限系统需要和别的系统集成,因此,良好的API是易用性的保证. 这里只设计一些权限相关的核心 API,关于用户,组织,导入导出之类的后续再逐步补充 API 设计 围绕权限有以下 4 类 API: ... 
- python 全栈开发,Day107(CRM初始,权限组件之权限控制,权限系统表设计)
		一.CRM初始 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ... 
- YbSoftwareFactory 代码生成插件【十七】:先进的权限模型体系设计
		目前权限管理系统不少,但通用.灵活.符合现代企事业单位实际工作需要的不多.现有的权限系统绝大多数都是以模块为核心,而本权限模型将摒弃此类普遍的做法,将以组织机构为核心来进行权限系统的设计,因为这更符合 ... 
随机推荐
- RocketMQ(八):消息发送
			匠心零度 转载请注明原创出处,谢谢! RocketMQ网络部署图 NameServer:在系统中是做命名服务,更新和发现 broker服务. Broker-Master:broker 消息主机服务器. ... 
- 解决Win8/8.1无法正确识别USB3.0的问题
			找一个USB3.0的移动硬盘到了手里竟然变成2.0的了!二了! 不能忍啊. 听说是快速启动的问题,但是开机速度快很诱人. 百度了其他解决方法,终于解决了. 下面摘录自: http://blog.csd ... 
- STL_算法_删除(unique、unique_copy)
			C++ Primer 学习中. . . 简单记录下我的学习过程 (代码为主) 全部容器适用 unique(b,e) unique(b,e,p) unique_copy(b1,e1,b2) unique ... 
- Sending e-mail with Spring MVC--转载
			原文地址:http://www.codejava.net/frameworks/spring/sending-e-mail-with-spring-mvc Table of contents: 1.S ... 
- Java 服务端入门和进阶指南
			作者:谢龙 链接:https://www.zhihu.com/question/29581524/answer/44872235 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 现在互联网上资 ... 
- SpringBoot错误信息总结(不定时更新)
			1." java.lang.IllegalStateException: @Bean method ShiroConfig.cacheManager called as a bean ref ... 
- 在 AppDelegate 设置屏幕切换
			//禁止横屏显示 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWin ... 
- Delegates, Events and Singletons with Unity3D – C#
			 在这里我将演示怎样创建代表. 事件和Singletons 在一起工作. 本教程为 Unity3D 编写. 我想知道这为什么?作为一个年轻的自学程序猿,我常常发现自己写tons 和布尔的语句,以确 ... 
- 18.1 IIC驱动程序(基于3.4.2内核)
			驱动使用smbus提供的IIC读写函数可以参考smbus-protocol.txt文档:应用层直接使用IIC读写函数读写IIC设备,应用层读写函数是由i2c-tools这个库提供的(编译的使用和应用程 ... 
- [PReact] Create a Hello World App with Preact
			By creating a simple ‘hello world’ example application first in vanilla Javascript, and then in Prea ... 
