第三篇中。我们通过维护节点的深度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,递归构建树的更多相关文章

  1. 设计与实现的简单和经常使用的权限系统(五岁以下儿童):不维护节点的深度level,手工计算level,树形结构

     以这种方式.和第三的类似介绍.所不同的是.深度未在数据库中存储节点level,添加和更改时间,护.而是,在程序中,实时去计算的. 至于后面的,依照level升序排序,再迭代全部的节点构造树,与第三篇 ...

  2. 简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树

    第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树.  本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰 ...

  3. 转:RBAC如何设计一个权限系统

    前言 权限管理是所有后台系统的都会涉及的一个重要组成部分,主要目的是对不同的人访问资源进行权限的控制,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,隐私数据泄露等问题.目前在公司负责权限这块 ...

  4. 大一C语言结课设计之《简单计算器》

    /*===============================================*\ ** 设计目的:简单计算器,计算形如10*(20.2-30.6)+5.0/2的表达式值 ** 简 ...

  5. “权限系统_基于HUI”的简单介绍和交流

    昂,最近比较闲,写了个权限系统. 后端框架还是老样子,基于本人自己搭建的后台基础开发框架"Spring_Mvc_EF":前端框架,我挑选了一阵子,最后选用了HUI前端开发框架,因为 ...

  6. 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度

    <Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ...

  7. 软件架构设计学习总结(1):标准Web系统的架构分层

    1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层的技术都需要使用.例如:一 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  9. .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记

    目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...

随机推荐

  1. MAC地址格式小结

    之前一段时间在做网卡驱动的工作,如今产品量产,利用ifconfig eth hw ether在配置mac地址时发现一个问题, 随机配置一个mac地址,发现有的会报出Cannot assign requ ...

  2. 用python调用R做数据分析-准备工作

    0.R的介绍 R是自由软件,不带不论什么担保.在某些条件下你能够将其自由散布,用'license()'或'licence()'来看散布的具体条件. R是个合作计划.有很多人为之做出了贡献,用'cont ...

  3. Operand should contain 1 column(s)

    今天sql当测试发现错误:Operand should contain 1 column(s). 因为in背后有多种条件字段,in只有有背后场.

  4. FREESWITCH SEESION

    SESSION SESSION为FS的核心概念之一,所以需要拿出来专门的分析下. 从以下几个方面进行分析,结构类型,资源的管理,对于呼叫的意义,规格. 1.结构类型 每一次呼叫会申请一个session ...

  5. oracle转Mysql中,varchar2(10)和number应该转换为什么类型? (转)

    一. varchar2(10)和number应该转换为什么类型? oracle转成mysql时:varchar2(10)可以转成varchar(10)number则要看oracle中存储的具体是什么类 ...

  6. Node.js : 我只需要一个店小二

    刚刚开始接触Node.js时, google了很多文章,但发现大部分都是泛泛的介绍安装,配置,以及介绍几个小例子 有一种雾里观花的感觉,所以非常困惑,不知道Node.js到底解决了什么问题,它的优势到 ...

  7. github源码开源区块链浏览器

    <ignore_js_op> 帅爆了吧 https://blockexplorer.com/ github源码:https://github.com/bitcoin-blockexplor ...

  8. 开源Math.NET基础数学类库使用(16)C#计算矩阵秩

    原文:[原创]开源Math.NET基础数学类库使用(16)C#计算矩阵秩                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...

  9. 选择排序java

    先简述选择排序,然后上代码 进行选择排序就是将所有的元素扫描一遍,从中挑选(或者说是选择,这正是这个排序名字的由来)最小的一个元素,将这个最小的元素与最左边的元素交换位置 ,现在最左边的元素就是有序的 ...

  10. VS2010程序打包操作

    摘录:http://www.cnblogs.com/daban/archive/2012/06/27/2565449.html   1.  在vs2010 选择“新建项目”----“其他项目类型”-- ...