2012-08-28 7 views
0

Я пытаюсь сохранить Гражданский испанский код.Список списков списков в Java

Он разделен следующим образом:

Books 

----Chapters 

--------Articles 

ИЛИ

Books 

----Titles 

--------Chapters 

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

ИЛИ

Books 

----Titles 

--------Chapters 

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

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

книги, названия, главы и разделы должны хранить int identifier и String with the name of the book, title и т. Д. Количество элементов является переменным, так как некоторые Например, книги имеют больше глав, чем другие.

Articles необходимо хранить и int identifier и String с содержанием статьи.

Я бы оценил пример declaration and usage (в данных, вне данных) структуры, поскольку (для меня) это немного сложно.

+4

Можете ли вы использовать XML для этого? – Teejay

+2

XML будет лучшим способом для манипулирования данными такого типа –

+2

Я сомневаюсь, что списки вложений очень полезны здесь. У меня был бы один «Список », и я бы добавил индексы, используя Карты, по мере необходимости. –

ответ

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 может быть любой посетитель, который принимает ID, Name и подклассы могут быть любого формата (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) и т. д.)

Вы также можете поместить эти винды за методы в отдельный класс (например, 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 
} 

Для меня это самый простой способ. Версия The Elite Gentleman немного сложнее, но, с другой стороны, более надежна для изменения модели домена (добавление новых типов или изменение отношений).

+0

Когда я впервые начал думать, что я думал о такой структуре, но думал, что это неэффективно. Это? – yafrack

+0

Вы можете создать общий класс с свойством 'id', а не всегда вводить' id' во всех классах. –

+0

Неэффективен? По сравнению с списками списков списков списков? Неправильно. – duffymo

Смежные вопросы