2012-08-28 145 views
0

我试图存储民间西班牙语代码。Java列表清单列表

正是在这样的方式分为:

Books 

----Chapters 

--------Articles 

OR

Books 

----Titles 

--------Chapters 

-------------Articles 

OR

Books 

----Titles 

--------Chapters 

-------------Sections 

-----------------Articles 

书,标题,章节必须存储的int identifierString with the name of the booktitle等。元素的数量是可变的,因为一些例如,书比其他书有更多的章节。

Articles必须存储和int identifierString与文章的内容。

我会对该结构的declaration and usage(在数据,输出数据中)的例子进行补充,因为(对我而言)它有点复杂。

+4

想要使用XML吗? – Teejay

+2

XML将是处理这种数据的最佳方式 –

+2

我怀疑嵌套列表在这里真的很有用。我会有一个'List ',我会根据需要使用地图添加索引。 –

回答

0

而是创建节点树结构,如下所示(这是一个psedo代码,可以帮助你):

public interface Node { 
    public int getId(); 
    public String getName(); 

    public void saveTo(SaveVisitor visitor); 
} 

public abstract class AbstractNode { 
    public List<Node> children; 

    //Getters 
    public List<Node> getChildren() { return children; } 

    public void addChild(Node node) { 
     if (children == null) { 
      children = new ArrayList<Node>(); 
     } 

     children.add(node); 
    } 

    @Override 
    public void saveTo(SaveVisitor visitor) { 
     if (visitor != null) { 
      visitor.setId(getId()); 
      visitor.setName(getName()); 

      if (children != null) { 
       for (Node child: children) { 
        child.saveTo(visitor); 
       } 
      } 
     } 
    } 
} 


public class Book extends AbstractNode { 

} 

public class Title extends AbstractNode { 

} 

public class Chapter extends AbstractNode { 

} 

public class Section extends AbstractNode { 

} 

public class Article extends AbstractNode { 

} 

SaveVisitor可以接受IDName任何访问者,而子类可以可以是任何格式(XML,JSON,结构化明文,Excel等)。

+0

谢谢,只是一个问题。你怎么知道你要添加什么样的孩子?或者你只是不在乎?我问这个,因为当我使用信息时,我需要知道我正在访问的章节孩子是文章还是章节。 – yafrack

+0

现在,孩子们是通用的,但是你可以把你的抽象方法封装到受保护的地方,并且创建必要的'add'方法,它更加具体到你想要的'Node'。 –

0

我的建议是一个Map<Index, Entry>Entry是文本(也许一个简单的字符串或类似的东西)和Index存储坐标

class Index { 
    public int book, title, chapter, section, article; 
} 

你可以这样实现Index具有可比性(equals()/compareTo())并可能提供一些方法导航到该书(getNextChapter(Index),isLastArticle(Index)等)

你也可以把那些hel每种方法分成一个单独的类(如CivilSpanishCodeHandler),以保持一切清洁。

此外,Tree会想到,因为它会是最自然的表示。虽然我会建议编码自己的树结构来实现上面提到的所有辅助方法到树中。

1

这个怎么样?那么,只有原始类型和容器都可以实现,但为什么?那么它的可读性就差得多。

public class Book { 
    private int id; 
    private List<Chapter> chapters; 
    private List<Title> titles; 

    // getters/setters/constructor 
} 

public class Chapter { 
    private int id; 
    private List<Section> section; 
    private List<Article> articles; 

    // getters/setters/constructor 
} 

public class Title { 
    private int id; 
    private List<Chapter> chapters; 

    // getters/setters/constructor 
} 

public class Section { 
    private int id; 
    private List<Article> articles; 

    // getters/setters/constructor 
} 

对我来说这是最简单的方法。精英绅士的版本稍微复杂一点,但另一方面更强大的领域模型改变(增加新的类型或改变关系)。

+0

当我第一次开始思考时,我想到了这样的结构,但认为效率不高。是吗? – yafrack

+0

您可以创建一个具有“id”属性的泛型类,而不是在所有类中始终输入“id”。 –

+0

无效?与列表清单列表相比较?又错了。 – duffymo