2013-11-21 46 views
3

假設我們有一組類別:categories = {A,B}。讓我們假設更多A由子類別組成:{A1,A2,A3}和B由子類別{B1,B2}組成。此外,還有更多的子類別如下:對於A1:{A1a,A1b},對於A2 :對於A3:{A3a,A3b,A3c},對於B1:{B1a,B1b,B1c},對於B2:{B2a,B2b}:{A2a,A2b}。我怎樣才能在java中構建分層結構?如何使用枚舉或任何其他方式構建java類別的層次結構樹?

由於每組的基數是固定的並且事先已知,我最初的方法是使用枚舉類型而不是繼承構建類,但我願意接受任何建議。我不知道如何解決這個問題。

在此先感謝。與java.util.Collection值類型

回答

4

也許這樣的實現:

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); 
} 
+1

+1 - 好主意。我正在考慮某種界面層次結構,但這樣更清晰。 – Will

+0

由於類別層次結構是預定義的,因此界面不需要增強器。 – SpaceTrucker

+0

@Laksa:我喜歡這個解決方案,因爲它速度快,清晰。 – YiannaCo

1

java.util.Map對象可以表示任意的樹結構:

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

+0

感謝很多的unmodifiableSet理念和DefaultTreeModel的。 – YiannaCo

2

除了上述問題的答案,我想和大家分享一些我在互聯網上找到了。我沒有測試它,但它似乎提供了一種替代方案:

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; 
}