浏览 5417 次
锁定老帖子 主题:二维树型描述信息转换为内存中树型结构数据
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-07
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); } } 希望大家提出意见,提高扩展性和执行效率 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-11-13
你的代码太笼统,只能表述个意思。
树的实现、框架上很简单、大致上就是: 一个节点node类(内含object值对象,这个值对象继承自某公共父抽象类,父类实现了同类对象值的比较、“大小”的比较等方法) 一个树tree类(仅持有root节点) 具体上就难了: 节点对象自身要有方法(以自身为根的子树内部增删改查节点的方法) 树对象也有增删改查方法(从根开始递归调用下层所有节点子树的增删改查) 我们仅仅持有树tree对象即可,因为数对象持有根节点对象,由JVM自身所维护的对象树我们可以遍历全树(类似于GC)。这样内存多叉树结构的实现就可以达成了。 如果是为了快速查找目的自平衡二叉树、甚至红黑树,似乎也可以用一个数组或链表来存储全部节点,节点存储顺序代表某个遍历序,据此维护节点对象的层次关系。也可以和多叉树一样。实现起来要对一些概念纯熟才行,比如红黑树节点的各种翻转、着色过程,这个比较复杂。 但是比较困惑的是内存树结构在实际当中能用上的地方不多。比较显著的好处就是可以提供一个免维护的统一的操作接口(也就是tree对象了)。而且即使用上效率未必比不用强。不用树结构,嵌套使用hashmap等JAVA集合对象,效率已经很高了。 |
|
返回顶楼 | |
发表时间:2006-11-13
目前我只是想 把数据库里的信息映射为内存中的树结构,然后把这个树结构通过castor框架直接映射到XML文件。
其实用处不是很大,我也没有考虑树结点的增删问题,这些功能目前是通过这个数据库表对应的dao完成的,这里只是单向的mapping. |
|
返回顶楼 | |
发表时间:2006-11-13
一般树操作扩展一下DefaultMutableTreeNode就足够了,里面有很多值得借鉴的写法。
|
|
返回顶楼 | |