<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(2533) 評論(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

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


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


    網站導航:
     
    主站蜘蛛池模板: 超pen个人视频国产免费观看| 中文字幕精品无码亚洲字| 免费视频精品一区二区| 国产亚洲成人在线播放va| 57pao一国产成视频永久免费| 伊人久久亚洲综合影院首页| 亚洲国产综合精品中文字幕| 午夜免费福利片观看| 亚洲av日韩av永久在线观看| 亚洲国产精品无码av| 日韩中文无码有码免费视频 | 在线看片v免费观看视频777| 亚洲a∨无码精品色午夜| 久久精品国产亚洲一区二区| 毛片免费视频播放| 免费一区二区无码东京热| 中文字幕亚洲男人的天堂网络| 国外亚洲成AV人片在线观看 | 国产精品成人四虎免费视频| 日韩电影免费在线观看| 日韩亚洲综合精品国产| 亚洲午夜视频在线观看| 免费人成视频在线观看不卡| 免费毛片a在线观看67194| 久久久久久av无码免费看大片| 最新国产成人亚洲精品影院| 亚洲国产婷婷六月丁香| 国产精品免费视频网站| 2021国内精品久久久久精免费| 一个人免费播放在线视频看片| 77777午夜亚洲| 亚洲a在线视频视频| 亚洲伊人成无码综合网| 日本媚薬痉挛在线观看免费| 欧洲精品99毛片免费高清观看| 一级毛片正片免费视频手机看 | 亚洲日韩精品国产3区| 久久久久亚洲AV成人片| 国产成人精品日本亚洲专区61 | 国产麻豆剧传媒精品国产免费| 亚洲三级在线免费观看|