간결한 상용 권한 시스템의 설계와 실현(四): level을 유지하지 않고 귀속 방식으로 트리를 구성한다.

1852 단어
3편에서 우리는 노드의 깊이를 유지하는 level을 통해 모든 노드를 교체하고 한 번만 하면 나무를 구성한다.이 편은 다른 방식으로 바뀌었다.장점은 노드의 깊이 level을 유지하지 않고 노드를 추가하고 수정할 때 유지하지 않아도 된다는 것이다.귀속 실현으로 코드가 비교적 뚜렷하다.단점은 노드가 많을 때 성능이 좋지 않을 수도 있다는 것이다.노드의 깊이 level을 직접 조회할 수 없습니다.물론 level 필드가 필요하면 귀환 과정에서 계산할 수 있습니다.귀환 과정에서 level을 계산하는 것에 관해서는 뒤에 이런 방법이 소개되어 있다.나무에 대한 두루 훑어보기와 검색에 관해서는 모두 기초가 있다. 위에서 몇 가지 전체적인 사고방식을 묘사했고 코드에 주석이 있으니 기본적으로 더 이상 상세하게 소개할 필요가 없다.  
4
// 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

좋은 웹페이지 즐겨찾기