`
yaoweinan
  • 浏览: 133254 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Tree 结构的存储与反转

 
阅读更多



   在平常的项目中经常使用tree,我们也需要将这些treenode的信息持久化,然而实际的数据库中我们不是将某个node的子节点字段作为父节点的一个字段,当然这也不符合实际情况(父子关系,没有父亲,哪来儿子?)所以我们通常的tree 的一个node对象一般都存parent_id.如图是也treenode 的类图

作为一个简单的存储我们只需要将id,name,parent_id 存储起来。当然存储很简单,利用递归遍历树结构,存储所有的node就OK.

如果你的tree是动态加载,那么不存在什么问题,你只要根据parent_id 进行检索,进而渲染node就可以了,如果ui要一次将所有的node渲染上去,那么我们该如何将这一条条数据构建成一个tree model?

当然本办法还是有的,我们利用递归也能实现代码 如下:

 

 

private static Node popularTree(List<Node> nodes,Node p_node) {
		if(nodes.contains(p_node))nodes.remove(p_node);
		for(Node node:nodes){
			if(node.getParent_id().equals(p_node.getId())){
				p_node.getChildren().add(node);
				popularTree(nodes,node);
			}
		}
		return p_node;
		
	}

 即使每次都会去掉当前节点,但是如果一个tree稍微大一点那么,这个来做会有很多很多循环,导致构建tree model 非常耗时。

那么我们能否想一种更好的办法? 当然我这里写此博客不是来说明前面的,重点还是后面。

其实我们不需要这递归 循环。 我们将所有的node 以id为key 以 node对象为value存放的一个map中,

然后我们的代码就变得如此简单:

	private static Node popularTree(Map<Integer,Node> nodesMap,List<Node> nodesList,Node root){
		for(Node node:nodesList){
			if(node.getParent_id().equals(root.getId())){
				root.getChildren().add(node);
			}else if(nodesMap.containsKey(node.getParent_id())){
				nodesMap.get(node.getParent_id()).getChildren().add(node);
			}
		}
		return root;
	}

 这样的话我们就仅仅遍历了2次,但是具体第一种方法会执行多少个循环我也不知道。

 

小记:在我们平时的编程中不一定要按照实际的一些想法来组织数据,我们需要从多个角度来思考,这样话我们的代码执行效率也会有所提高。

  • 大小: 1.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics