• 简洁常用权限系统的设计与实现(七):一种错误的不可行的构造树的方法


     前面介绍了4种方法(实质是3种),构造树。

      在此,需要特别说明的是,那些都是成功的、漂亮的方法和案例 ,但实际上在解决问题的过程中,有很多其它的尝试。
    比如本篇介绍的方法,就是不可行的。
      想说明一个道理,在走向成功的道路上,会经历很多不算太成功的事情。

       我们在前面的例子中,用递归计算子结点的深度level。但实际上,我最开始想到的一种方法正好反过来了。

      思路:最底层的节点level为1,如果当前节点有父结点,就把自己的level+1,递归把自己的父结点的level+1.

      
    // 计算所有节点的level
    public static List<Map<String, Object>> caculateLevelWrong(
    List<Map<String, Object>> privilegeList) {
    List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
    resultList.addAll(privilegeList);
    //默认所有的节点level为1
    for (Map<String, Object> p : resultList) {
    p.put("level", 1);
    }
    List<Map<String, Object>> topLevelList =  TreeMenuUtil.findTopLevelNodeList(privilegeList);
    for (Map<String, Object> p : topLevelList) {
    child(privilegeList, p);
    }
    return privilegeList;
    }

    private static void child(List<Map<String, Object>> list,
    Map<String, Object> p) {
    List<Map<String, Object>> childList = TreeMenuUtil.findAllChild(p,
    list);
    if (childList != null && childList.size() > 0) {
    levelPlus(p);
    parentPlusOne(p, list);
    }
    // 无法保证多个子结点,都有子结点的时候,他们的父结点,重复增加了level,而重复计算的次数很难去统计
    for (Map<String, Object> child : childList) {
    child(list, child);
    }
    }

      这种方法,
    计算所有节点的level,可能会存在重复计算的情况。最下级的节点的level为1,与其它地方的定义不同。
    为了解决重复计算的问题,我想到了把计算过的节点,维护下,防止重复计算,但是没有找到好的方法。

      刚刚突然想到,既然从顶层到底层,计算level,是可行的。按说,从下至上计算level也是可以的。
    这种方法,就不去尝试了,有兴趣的可以去试试。

      方法已经有3种以上了,各有利弊,暂时就写到这吧。

      等过段时间,权限系统有了新的进展之后,再继续...

      To be continued... 
    原文首发:http://fansunion.cn/article/detail/575.html
  • 相关阅读:
    根据浏览器是否出现滚动条,显示返回顶部
    HTML5 屏蔽触屏滚动
    url参数中带有+号,服务器端解码之后没了
    jQuery1.9之后使用on()绑定 动态生成元素的 事件无效
    列表页复选框全选效果
    Python安装sqlite3
    python3.5中,import sqlite3 出现 no module named _sqlite3的解决方法
    使用js设置input标签只读 readonly 属性
    怎么获得当前点击的按钮的id名?
    JS 浮点型数字运算(转)
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463010.html
Copyright © 2020-2023  润新知