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


     前面介绍了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
  • 相关阅读:
    du 命令计算隐藏文件夹或文件
    QEMU中VIRTIO实现
    virtio_blk
    网络虚拟化Virtio-net
    virtio desc
    vhost dpdk 共享内存
    gvisor 信号处理
    Java idea 执行单个测试方法
    Java idea 创建User.xml,需要新增一个mybatis-mapper.xml模板
    Java idea 创建log4j.properties
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463010.html
Copyright © 2020-2023  润新知