设计与实现简单而经常使用的权限系统(四):无需维护level,递归构建树
2015-09-25 15:31
447 查看
第三篇中。我们通过维护节点的深度level,通过迭代全部的节点,仅仅须要一次,就构造了树。
本篇。换一种方式。
优点是:不维护节点的深度level,添加和改动节点时,也不用维护。递归实现,代码比較清晰。
坏处是:节点较多的时候。性能可能不够好。不能直接查询到节点的深度level。
当然。假设须要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
相关文章推荐
- LinuxSystemProgramming-vi
- opencv2-2渐变过渡各种图形滤波并输出文字
- apache 目录认证
- linuxshell中"2>&1"含义
- linux下mycat读写分离的配置
- linux代码段,数据段,BSS段, 堆,栈
- linux下查看最消耗CPU、内存的进程
- 微服务架构思考
- centos下svn 安装配置,及用户权限设置
- Linux-CentOS libstdc++.so.6:version`GLIBCXX_3.4.9'notfound 解决方法
- 一台电脑配置多个tomcat,同时运行,互不冲突
- 集装箱学习(两):动手模拟AOP
- hadoop小文件问题&解决方案
- DBX error:Driver could not be properly initialized .... 解决办法
- linux增加根分区大小
- 网站技术笔记-演化
- 运维必须掌握的Linux面试题
- web网站中腾讯空间分享不了的问题
- 在CentOS下面编译WizNote Qt Project
- 如何在 Linux 中整理磁盘碎片