日期:2011-01-26 02:54:00 来源:本站整理
基于Java实现的多层目录构造[Java编程]
本文“基于Java实现的多层目录构造[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
近来在做小需求的时刻,需求用到目录树,特地写了一个基于java的实现.
由于需求缘由,目前只实现了读部份的功效——若何将平面节点build成树.动态新增,删除等功效还没有实现.
目录构造概念:
Node:目录节点,具有节点属性信息
NodeStore:平面目录节点长期化接口,供应办法以下:
public List<T> findByType(String type); -- 按照目录范例,获得该范例下全部的节点(平面节点)
public void add(T node);--将增添节点长期化
public void update(T node);--将改正节点长期化
public void delete(T node);--删除节点
public void move(T src, T target); --将移动节点长期化
NodeStore是一个接口,可以基于DB实现,也可以基于XML实现,或则其他你需求的方法.
Tree:目录树,主要职责:
通过NodeStore load某一范例目录的全部平面节点,build成树;
按照节点id号,查找呼应的节点信息
动态新增,改正,删除,移动节点,通过NodeStore将改变长期化;
目录构造实现类图:(目前只实现了读办法)
附上Node,Tree类的核心代码
Node.java
1 public class Node implements Serializable, Comparable<Node> { 2 3 private static final long serialVersionUID = 8085266615416399579L; 4 5 private Integer id; // id号 6 private Integer parentId;// 父亲id号 7 private String name;// 目录名 8 private String description;// 目录描写 9 private String type;// 目录范例 10 11 private Node parent;// 父亲 12 private List<Node> children;// 儿子 13 14 /** 15 * 增添子节点,并且成立与当前节点的父子关系 16 * 17 * @param child 儿子节点 18 */ 19 public void addChild(Node child) { 20 if (child == null) { 21 return; 22 } 23 // 设置当前节点为child的父节点 24 child.setParent(this); 25 // 当前节点增添child为儿子节点 26 if (getChildren() == null) { 27 setChildren(new ArrayList<Node>()); 28 } 29 getChildren().add(child); 30 } 31 32 /** 33 * 删除子节点,并且成立与当前节点的父子关系 34 * 35 * @param child 儿子节点 36 */ 37 public void removeChild(Node child) { 38 if (child == null) { 39 return; 40 } 41 // 将child节点的父节点清空 42 child.setParent(null); 43 if (getChildren() == null) { 44 return; 45 } 46 // 当前节点删除child这个儿子节点 47 getChildren().remove(child); 48 } 49 50 /** 51 * 得到全途径 52 * 53 * @param sep 脱离标记 54 * @return 55 */ 56 public String getPathName(String sep) { 57 String pathName = getName(); 58 if (getParent() != null) { 59 pathName = getParent().getPathName(sep) + sep + pathName; 60 } 61 return pathName; 62 } 63 64 /** 65 * 判断能否root节点 66 * 67 * @return 68 */ 69 public boolean isRootNode() { 70 return getParentId() == -1; 71 } 72 73 /** 74 * 判断能否是叶子节点 75 * 76 * @return 77 */ 78 public boolean isEndNode() { 79 return getChildren() == null || getChildren().isEmpty(); 80 } 81 82 /** 83 * 对当前节点的儿子节点举行排序 84 */ 85 public void sortChildren() { 86 if (isEndNode()) { 87 return; 88 } 89 Collections.sort(getChildren()); 90 } 91 92 /** 93 * 对当前节点的全部儿子节点举行排序 94 */ 95 public void sortAllChidren() { 96 if (isEndNode()) { 97 return; 98 } 99 List<Node> children = getChildren(); 100 Collections.sort(children); 101 for (Node child : children) { 102 child.sortAllChidren(); 103 } 104 } 105 106 /** 107 * 将虚拟目录转换成JSONObject对象 108 * <p> 109 * 本身转换包含id、name两个属性,子节点转换为children属性的数组 110 * </p> 111 * 112 * @return 113 */ 114 public JSONObject toJson() { 115 JSONObject jsonObject = new JSONObject(); 116 try { 117 jsonObject.put("id", id); 118 jsonObject.put("name", name); 119 if (!isEndNode()) { 120 JSONArray jsonArray = new JSONArray(); 121 for (Node child : getChildren()) { 122 jsonArray.put(child.toJson()); 123 } 124 jsonObject.put("children", jsonArray); 125 } 126 } catch (JSONException e) { 127 // ignore 128 } 129 return jsonObject; 130 } 131 132 @Override 133 public int compareTo(Node o) { 134 return this.getId().compareTo(o.getId()); 135 } 136 137 } |
Tree.java:
1 public class Tree<T extends Node> { 2 3 private String type; 4 private Node root; // root节点 5 private Map<Integer, T> nodeHolder = new HashMap<Integer, T>();// 节点持有器 6 7 private NodeStore<T> nodeStore; 8 9 /** 10 * 将平面的node list构建成树 11 * 12 * @throws TreeException 13 */ 14 public void build() throws TreeException { 15 List<T> nodes = nodeStore.findByType(type); 16 // 假如nodes为空,则不做任何处理 17 if (nodes == null || nodes.isEmpty()) { 18 return; 19 } 20 // 设置root和node持有器 21 for (T node : nodes) { 22 if (node.isRootNode()) { 23 this.root = node; 24 } 25 nodeHolder.put(node.getId(), node); 26 } 27 28 // 假如root为空,则build失利了 29 if (root == null) { 30 throw new TreeException("no root node found."); 31 } 32 33 // 成立节点之前关系 34 for (T node : nodes) { 35 if (node.isRootNode()) { 36 continue; 37 } 38 Node parent = getNodeById(node.getParentId()); 39 if (parent == null) { 40 throw new TreeException("no parent node found.current node id is:" + node.getId()); 41 } 42 parent.addChild(node); 43 } 44 45 // 排序 46 root.sortAllChidren(); 47 } 48 49 /** 50 * 得到root节点 51 * 52 * @return 53 */ 54 public Node getRoot() { 55 return root; 56 } 57 58 /** 59 * 按照id得到对应节点 60 * 61 * @param id 62 * @return 63 */ 64 public Node getNodeById(Integer id) { 65 return nodeHolder.get(id); 66 } 67 68 public void setType(String type) { 69 this.type = type; 70 } 71 72 public void setNodeStore(NodeStore nodeStore) { 73 this.nodeStore = nodeStore; 74 } 75 76 } |
附上中国省份,城市,区域信息xml文件
中国区域文件
该文件取之网络,做了改正.但是还有部份信息是不精确的,牢记.
附上源码(功效不全)
tree源码
以上是“基于Java实现的多层目录构造[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论