首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 认证考试 > JAVA认证 >

基于Java实现的多层目录结构(1)

2009-03-05 
多层目录结构

    最近在做小需求的时候,需要用到目录树,特地写了一个基于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对象

热点排行