前面介绍了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