Как построить иерархическое дерево категорий в java с помощью перечислений или любым другим способом?

Предполагая, что у нас есть набор категорий: Categories = {A, B}. Предположим также, что A состоит из подкатегорий: {A1, A2, A3} и B состоит из подкатегорий: {B1, B2}. Кроме того, существует еще больше подкатегорий, а именно: для A1: {A1a, A1b}, для A2 : {A2a, A2b}, для A3: {A3a, A3b, A3c}, для B1: {B1a, B1b, B1c}, для B2: {B2a, B2b}. Как я могу построить иерархическую структуру в Java?

Поскольку мощность каждого набора фиксирована и известна заранее, мой первоначальный подход заключается в использовании перечислимых типов вместо построения классов с наследованием, но я открыт для любых предложений. Я не знаю, как подойти к этой проблеме.

Заранее спасибо.


person YiannaCo    schedule 21.11.2013    source источник


Ответы (3)


Вероятно, реализация этого:

public interface Category {
    String getName();
    Category getParent();
    List<Category> getSiblings();
    List<Category> getChildren();
    List<Category> getDescendants();
    void addChild(Category category);
    void addChildren(List<Category> categories);
}
person Michael    schedule 21.11.2013
comment
+1 - Хорошая идея. Я думал о какой-то иерархии интерфейсов, но это чище. - person Will; 21.11.2013
comment
Поскольку иерархия категорий предопределена, интерфейс не нуждается в мутаторах. - person SpaceTrucker; 21.11.2013

В дополнение к приведенным выше ответам я хотел бы поделиться тем, что нашел в Интернете. Я еще не тестировал, но, похоже, предлагает альтернативу:

http://alexradzin.blogspot.hk/2010/10/hierarchical-structures-with-java-enums_05.html

public enum OsType {
OS(null),
    Windows(OS),
        WindowsNT(Windows),
            WindowsNTWorkstation(WindowsNT),
            WindowsNTServer(WindowsNT),
        Windows2000(Windows),
            Windows2000Server(Windows2000),
            Windows2000Workstation(Windows2000),
        WindowsXp(Windows),
        WindowsVista(Windows),
        Windows7(Windows),
        Windows95(Windows),
        Windows98(Windows),
    Unix(OS) {
            @Override
            public boolean supportsXWindows() {
                return true;
            }
        },
        Linux(Unix),
        AIX(Unix),
        HpUx(Unix),
        SunOs(Unix),
;
private OsType parent = null;

private OsType(OsType parent) {
    this.parent = parent;
}
person YiannaCo    schedule 21.11.2013

java.util.Map объекты с java.util.Collection типами значений могут представлять произвольные древовидные структуры:

    final Map<String,Set<String>> map = Collections.unmodifiableMap(
        new HashMap<String,Set<String>>() {
            {
                put(
                    "A",
                    Collections.unmodifiableSet(
                        new HashSet<>(Arrays.asList("A1", "A2", "A3"))
                    )
                );
                put(
                    "A1",
                    Collections.unmodifiableSet(
                        new HashSet<>(Arrays.asList("A1a", "A1b"))
                    )
                );
                put(
                    "A2",
                    Collections.unmodifiableSet(
                        new HashSet<>(Arrays.asList("A2a", "A2b"))
                    )
                );
                put(
                    "A3",
                    Collections.unmodifiableSet(
                        new HashSet<>(Arrays.asList("A3a", "A3b", "A3c"))
                    )
                );
                put(
                    "B",
                    Collections.unmodifiableSet(
                        new HashSet<>(Arrays.asList("B1", "B2"))
                    )
                );
                put(
                    "B1",
                    Collections.unmodifiableSet(
                        new HashSet<>(Arrays.asList("B1a", "B1b", "B1c"))
                    )
                );
                put(
                    "B2",
                    Collections.unmodifiableSet(
                        new HashSet<>(Arrays.asList("B2a", "B2b"))
                    )
                );
            }
        }
    );

Или вы можете попробовать что-нибудь вроде javax.swing.tree.DefaultTreeModel.

person Hollis Waite    schedule 21.11.2013
comment
Большое спасибо за идею unmodifiableSet и DefaultTreeModel. - person YiannaCo; 23.11.2013