一个Node实体类:
package com.design.patterns.composite; import java.util.ArrayList; import java.util.List; public class Node { // 编号 private long id; // 标题 private String title; // 下级列表 private List<Node> children = new ArrayList<Node>(); // 上级,顶层为null private Node parent; // 前一个节点 private Node prev; // 后一个节点 private Node next; // 当前处理的节点 private Node current; /** * 默认的构造器 */ public Node() { } /** * 推荐使用的构造器 * * @param id 编号 * @param title 文本 */ public Node(long id, String title) { this.id = id; this.title = title; } /** * 增加一个下属。<br> * 自动对应上级和兄弟结点 * * @param n 被增加的节点 */ public void addChild(Node n) { children.add(n); n.setParent(this); if (current != null) { current.next = n; } n.prev = current; current = n; } /** * 输出为下拉列表的方法 * * @param selectedId 被选中的编号 * @return 下拉列表的字符串。可以直接放到<select></select>里面 */ public String getOption(long selectedId) { return "<option>" + toStringOption("", "", selectedId); } /** * 输出为Text的方法。<br> * 应网友建议,更改toString为toStringText方法。 * * @param lftStr 左侧额外的字符串 * @param append 右侧显示的字符串 * @return 文本形式的字符串 */ public String toStringText(String lftStr, String append) { StringBuilder b = new StringBuilder(); b.append(append + title); b.append(" "); if (children.size() > 0) { for (int i = 0; i < children.size() - 1; i++) { b.append(lftStr + children.get(i).toStringText(lftStr + "│", "├")); } b.append(lftStr + children.get(children.size() - 1).toStringText(lftStr + " ", "└")); } return b.toString(); } public static void main(String[] args) { Node root = new Node(0, "菜单列表"); Node f1 = new Node(1, "开始菜单"); root.addChild(f1); Node f1_1 = new Node(11, "程序"); f1.addChild(f1_1); Node f1_1_1 = new Node(111, "附件"); f1_1.addChild(f1_1_1); Node f1_1_1_1 = new Node(1111, "娱乐"); f1_1_1.addChild(f1_1_1_1); Node f1_1_1_2 = new Node(1112, "娱乐2"); f1_1_1.addChild(f1_1_1_2); Node f1_2 = new Node(12, "辅助工具"); f1.addChild(f1_2); Node f2 = new Node(2, "My Documents "); root.addChild(f2); Node f3 = new Node(3, "My Documents2 "); root.addChild(f3); System.out.println(root.toStringText(" ", "")); System.out.println(root.getOption(111)); System.out.println(f1_1_1_2.getPrev().getTitle()); System.out.println(f1_1_1_2.getPrev().getParent().getTitle()); } public List<Node> getChildren() { return children; } public long getId() { return id; } /** * 得到下一个兄弟结点。 * * @return 如果是最后一个,则返回null */ public Node getNext() { return next; } public Node getParent() { return parent; } /** * 得到前一个兄弟结点。 * * @return 如果是第一个,则返回null */ public Node getPrev() { return prev; } public String getTitle() { return title; } public void setId(long id) { this.id = id; } public void setNext(Node next) { this.next = next; } public void setParent(Node parent) { this.parent = parent; } public void setPrev(Node prev) { this.prev = prev; } public void setTitle(String title) { this.title = title; } /** * 构造下拉列表. * * @param lftStr 左侧的字符 * @param append 增加的字符 * @param idSelected 被选中的编号 * @return 下拉列表字符串 */ private String toStringOption(String lftStr, String append, long idSelected) { StringBuilder b = new StringBuilder(); b.append(append + title + "</option>"); b.append(" "); if (children.size() > 0) { for (int i = 0; i < children.size() - 1; i++) { b.append("<option value='" + children.get(i).getId() + "'" + (idSelected == children.get(i).getId() ? " selected" : "") + ">" + lftStr + children.get(i).toStringOption(lftStr + "│", "├", idSelected)); } b.append("<option value='" + children.get(children.size() - 1).getId() + "'" + (idSelected == children.get(children.size() - 1).getId() ? " selected" : "") + ">" + lftStr + children.get(children.size() - 1).toStringOption(lftStr + " ", "└", idSelected)); } return b.toString(); } }
树形结构的构造类:
package com.design.patterns.composite; import java.util.ArrayList; import java.util.List; /* * 树形结构 */ public class TreeNode<T> { public T t; private String id; private String nodeName; private TreeNode<T> parent; private List<TreeNode<T>> childrenList = new ArrayList<TreeNode<T>>(); public TreeNode(String id,String nodeName) { // TODO Auto-generated constructor stub this.id=id; this.nodeName=nodeName; } /* * 添加一个节点 */ public void add(TreeNode<T> node) { this.childrenList.add(node); node.setParent(this); } /* * 删除一个节点 */ public void remove(TreeNode<T> node) { childrenList.remove(node); } //取得孩子节点 public List<TreeNode<T>> getChildren(){ return childrenList; } //展示该节点下的所有孩子节点 public void showAllNodes(TreeNode<T> node){ if (node != null) { System.out.println(node.getNodeName().toString()); for (int i = 0; i < node.childrenList.size(); i++) { TreeNode<T> nodes=node.childrenList.get(i); // System.out.println(nodes.getNodeName()); showAllNodes(nodes); } } } //展示该节点下的下层节点 public void showNextNodes(TreeNode<T> node){ if (node != null) { // System.out.println(node.getNodeName().toString()); for (int i = 0; i < node.childrenList.size(); i++) { TreeNode<T> nodes=node.childrenList.get(i); // System.out.println(nodes.getNodeName()); if (this.id.equals(nodes.getParent().getId())) { System.out.println(nodes.getNodeName()); } // if (nodes.id.startsWith((this.id))&&nodes.id.length()==2) { // System.out.println(nodes.getNodeName()); // } // if (nodes.id.startsWith((this.id))&&nodes.id.length()==4) { // System.out.println(nodes.getNodeName()); // } // showNextNodes(nodes); } } } public String getNodeName() { return nodeName; } public T getT() { return t; } public void setT(T t) { this.t = t; } public void setNodeName(String nodeName) { this.nodeName = nodeName; } public TreeNode<T> getParent() { return parent; } public void setParent(TreeNode<T> parent) { this.parent = parent; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
一个测试类:
package com.design.patterns.composite; import java.util.Enumeration; import java.util.List; import java.util.Vector; public class Tree { TreeNode root=null; public Tree(String id,String name) { // TODO Auto-generated constructor stub this.root= new TreeNode(id,name); } public static void main(String[] args) { Tree tree=new Tree("0","根目录"); TreeNode nodeB=new TreeNode("01","B"); tree.root.add(nodeB); TreeNode nodeC=new TreeNode("01_1","C"); nodeB.add(nodeC); TreeNode nodeD=new TreeNode("01_2","D"); nodeB.add(nodeD); TreeNode nodeF=new TreeNode("01_3","F"); nodeB.add(nodeF); TreeNode nodeE=new TreeNode("02","E"); tree.root.add(nodeE); // nodeC.remove(nodeD); // TreeNode nodes =tree.root; // nodes.showNextNodes(nodes); nodeB.showNextNodes(nodeB); nodeB.remove(nodeF); List list = nodeB.getChildren(); List list2 = tree.root.getChildren(); TreeNode nodes =tree.root; nodes.showAllNodes(nodes); Vector v = new Vector();//是同步的,多线程情况下可以用这个,ArrayList 是非同步的,效率要比Vector高一些 //向Vector中添加元素 //使用add方法直接添加元素 v.add("Test0"); v.add("Test1"); v.add("Test0"); v.add("Test2"); v.add("Test2"); //从Vector中删除元素 v.remove("Test0"); //删除指定内容的元素 v.remove(0); //按照索引号删除元素 //获得Vector中已有元素的个数 int size = v.size(); System.out.println("size:" + size); //遍历Vector中的元素 for(int i = 0;i < v.size();i++){ System.out.println(v.get(i)); } } }