当前位置:七道奇文章资讯编程技术Java编程
日期: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<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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>基于java的图片文件格局转换和线性缩放</b>
  • 基于Java 2运行时安全模子的线程合作
  • 深化浅出基于Java的责任链情势
  • 深化浅出基于Java的制作筹划情势
  • 操纵SWT开辟基于Java的图形用户界面
  • 深化浅出基于Java的代理筹划情势
  • 构建自己的基于Java的超级计算机
  • 基于Java的IDEA加密算法根究
  • 基于Java的UDP协议程序筹划初探
  • 基于Java的动画编程底子(一)
  • 基于Java的动画编程底子(二)
  • 深化浅出基于Java的注释器筹划情势
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .