程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於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 }

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved