简要常用权限系统的设计与实现(三):维护和利用节点的深度level,迭代实现树的构造

简洁常用权限系统的设计与实现(三):维护和利用节点的深度level,迭代实现树的构造

如果在节点的属性中,增加一个level属性,即树的深度,构造树会非常容易。前提是,增加和修改节点的时候,要维护level。

   根节点的level为1,下一级为2,以此类推。

  构造树的方法,主要有2个:

   // 按照level排序,根节点在上,子结点在下

public static List<Map<String, Object>> buildTree(List<TreeNode> list) {

List<Map<String, Object>> rootList = new ArrayList<Map<String, Object>>();

Map<String, Map<String, Object>> rootMap = new HashMap<String, Map<String, Object>>();

for (TreeNode node : list) {

Integer acl = node.getAcl();

Integer parentAcl = node.getParentAcl();

Map<String, Object> newNode = createNode(acl);

rootMap.put(acl + "", newNode);

if (parentAcl.equals(-1)) {

rootList.add(newNode);

} else {

Map<String, Object> fatherNode = rootMap.get(parentAcl + "");

addChild(fatherNode, newNode);

}

}

return rootList;

}



private static void addChild(Map<String, Object> father,

Map<String, Object> child) {

//如果father=null,一定是没有正确按照level排序导致的

if (father == null) {

System.out.println("error,Father is null");

return;

}

Object o = father.get("children");

List<Map<String, Object>> childs;

if (o == null) {

childs = new ArrayList<Map<String, Object>>();

father.put("children", childs);

} else {

childs = (List<Map<String, Object>>) o;

}

childs.add(child);

}

 只需要简单说几点:
1.按照level升序,*节点在最前面。
2.把每一个节点的父结点,先放进map。轮到子结点的时候,把它放进父结点的children中。
3.integer比较的时候, 用queals方法,而不是==。

4.Map的key是区分类型的。

map.put(1,"a");

map.get("1");

放进去的值,和取出来的值很可能不一样。

map的key不是同一个,integer的1和string的“1”是不同的。
5.addChild中的父结点,不可能为null。如果出现,一定是没有按照level正确排序。 

这种通过level的方式,构造树,好处是,构造很简单,坏处是,还得维护level,麻烦。