`
hasi
  • 浏览: 58239 次
  • 性别: Icon_minigender_1
  • 来自: 北京(老家内蒙古)
社区版块
存档分类
最新评论

二维树型描述信息转换为内存中树型结构数据

阅读更多
把id , parentId , name , url 结构的二维信息转换为内存中的树型结构对象
java类:
Node为容器接口,定义容器的规则
TreeNode为Node容器的实现类,有自己内部的存储结构
NodeService为对容器操作的接口
NodeLoader类通过NodeService类填充容器数据
public interface Node {
	public String getId();         
	public String getParentId();
	public Node[] getChild();
	public Object getValue();
	public void setId(String id);
	public void setParentId(String parentId);
	public void setChildNode(Node[] childNode);
	public void setValue(Object object);
}
public class TreeNode implements Node {
	private String id;
	private String parentId;
	private Node[] childNode;
	private Object value;
	//geters, setters methods
}
public interface  NodeService {
	public Node getRoot();
	public Node[] getChild(Node node);
}

public class NodeLoader {
	NodeService nodeService ;
	public Node load(NodeService nodeService) {
		this.nodeService = nodeService ;
		Node node = nodeService.getRoot();
		setChild(node);
		return node;

	}

	private void setChild(Node node) {
		Node[] childNode = nodeService.getChild(node);
		node.setChildNode(childNode);
		if (null == childNode) {
			return;
		}
		for (int i = 0; i < childNode.length; i++) {
			setChild(childNode[i]);
		}
	}
}

以菜单树型结构数据为例
Menu为具体的数据结构,作为Node的Object类型的value
MenuNodeService为NodeService接口的实现
public class Menu {
private String name ;
private String url ;
private String description ;
private String order ;

//geters, setters methods

public class MenuNodeService implements NodeService{

public Node getRoot(){
	Node rnode = MenuDao.getRootNode();
	return rnode ;
}
public Node[] getChild(Node node){
	Node[] rnodes = MenuDao.getChildNode(Node node);
	return rnodes ;
}
}

测试代码
public class TestMenuTree {
public static void main(String[] args){
	
	NodeLoader loader = new NodeLoader();
	NodeService nodeSerive = new MenuNodeService();
	Node node  =loader.load(nodeSerive);
	print(node);
}
public static void print(Node node){
	if(node.getChild() == null || node.getChild().length == 0) return ;
	for(int i = 0 ; i<node.getChild().length ; i ++){
		log(((Menu)(node.getChild()[i].getValue())).getName());
		print(node.getChild()[i]);
	}
}
public static void log(String s){
	System.out.println(s);
}
}


希望大家提出意见,提高扩展性和执行效率
分享到:
评论
3 楼 dada 2006-11-13  
一般树操作扩展一下DefaultMutableTreeNode就足够了,里面有很多值得借鉴的写法。
2 楼 hasi 2006-11-13  
目前我只是想 把数据库里的信息映射为内存中的树结构,然后把这个树结构通过castor框架直接映射到XML文件。
其实用处不是很大,我也没有考虑树结点的增删问题,这些功能目前是通过这个数据库表对应的dao完成的,这里只是单向的mapping.
1 楼 SINCE1978 2006-11-13  
你的代码太笼统,只能表述个意思。

树的实现、框架上很简单、大致上就是:
一个节点node类(内含object值对象,这个值对象继承自某公共父抽象类,父类实现了同类对象值的比较、“大小”的比较等方法)
一个树tree类(仅持有root节点)

具体上就难了:
节点对象自身要有方法(以自身为根的子树内部增删改查节点的方法)
树对象也有增删改查方法(从根开始递归调用下层所有节点子树的增删改查)
我们仅仅持有树tree对象即可,因为数对象持有根节点对象,由JVM自身所维护的对象树我们可以遍历全树(类似于GC)。这样内存多叉树结构的实现就可以达成了。
如果是为了快速查找目的自平衡二叉树、甚至红黑树,似乎也可以用一个数组或链表来存储全部节点,节点存储顺序代表某个遍历序,据此维护节点对象的层次关系。也可以和多叉树一样。实现起来要对一些概念纯熟才行,比如红黑树节点的各种翻转、着色过程,这个比较复杂。

但是比较困惑的是内存树结构在实际当中能用上的地方不多。比较显著的好处就是可以提供一个免维护的统一的操作接口(也就是tree对象了)。而且即使用上效率未必比不用强。不用树结构,嵌套使用hashmap等JAVA集合对象,效率已经很高了。

相关推荐

Global site tag (gtag.js) - Google Analytics