stone2083

          基于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源碼



          posted on 2009-02-28 21:25 stone2083 閱讀(2537) 評論(3)  編輯  收藏

          Feedback

          # re: 基于java實現的多層目錄結構 2009-03-01 13:53 Java宅男

          太高深了,看不懂~~俺是菜鳥  回復  更多評論   

          # re: 基于java實現的多層目錄結構 2009-03-06 18:52 44you

          好好研究一下去~  回復  更多評論   

          # re: 基于java實現的多層目錄結構 2009-03-07 11:08 stone2083

          其實這玩意,也是臨時之作,有很多不完善的地方。
          主要是提供一個思路,供大家一起討論。  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(9)

          隨筆分類(94)

          隨筆檔案(93)

          tech

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 灵寿县| 邹城市| 濉溪县| 商洛市| 兴宁市| 郑州市| 宁蒗| 永顺县| 镇安县| 赞皇县| 忻州市| 绩溪县| 肇州县| 黎川县| 益阳市| 西华县| 杭州市| 延吉市| 长春市| 巴彦淖尔市| 乌海市| 珲春市| 东乌珠穆沁旗| 扎兰屯市| 东海县| 商南县| 武穴市| 晋州市| 阳山县| 灌南县| 镇康县| 托克托县| 嘉义市| 金华市| 西林县| 施甸县| 前郭尔| 上高县| 栾川县| 禹州市| 广宁县|