首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-11-09 
二维树型描述信息转换为内存中树型结构数据把id , parentId , name , url 结构的二维信息转换为内存中的树

二维树型描述信息转换为内存中树型结构数据
把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 methodspublic 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);}}


希望大家提出意见,提高扩展性和执行效率 1 楼 SINCE1978 2006-11-13   你的代码太笼统,只能表述个意思。

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

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

但是比较困惑的是内存树结构在实际当中能用上的地方不多。比较显著的好处就是可以提供一个免维护的统一的操作接口(也就是tree对象了)。而且即使用上效率未必比不用强。不用树结构,嵌套使用hashmap等JAVA集合对象,效率已经很高了。 2 楼 hasi 2006-11-13   目前我只是想 把数据库里的信息映射为内存中的树结构,然后把这个树结构通过castor框架直接映射到XML文件。
其实用处不是很大,我也没有考虑树结点的增删问题,这些功能目前是通过这个数据库表对应的dao完成的,这里只是单向的mapping. 3 楼 dada 2006-11-13   一般树操作扩展一下DefaultMutableTreeNode就足够了,里面有很多值得借鉴的写法。

热点排行