2011-05-30 137 views
0

我想創建一個數組(枚舉)數組(枚舉)的數組(枚舉)的字符串的數組(枚舉)。我不認爲用Java實現這一點是可能的,但我聽說過EnumMap。如何將字符串項目放在一個枚舉枚舉的枚舉映射的字符串?

public class Tricky { 

    public enum enumA { A1, A2, A3 }; 
    public enum enumB { B1, B2, B3 }; 
    public enum enumC { C1, C2, C3 }; 

    HashMap<EnumMap<enumA, EnumMap<enumB, enumC>>,String> item 
     = new HashMap<EnumMap<enumA, EnumMap<enumB, enumC>>,String>(); 

    public Tricky() { 

     // How do I put and get strings in my hash map? 


    } 
} 

上面的代碼可以編譯,但是我怎樣才能在我的地圖中放置並獲取字符串項呢?

+0

你可以有希望做到這一點可能是什麼原因? EnumMap只是一個非常快速,高效的Map實現,當Enums是關鍵字時,其他值就是值。 – I82Much 2011-05-30 00:48:07

+0

您是否試圖將'enumA','enumB'和'enumC'中的一個值映射到一個字符串? – 2011-05-30 00:51:44

+0

@Ted Hopp是的,想法是我想通過提供enumA,enumB和enumC來檢索我的字符串。 – JVerstry 2011-05-30 00:54:13

回答

1

你可能會發現這個有用:

package p; 
enum enumA { 
    A1,A2,A3; 
} 
enum enumB { 
    B1,B2,B3; 
} 
enum enumC { 
    C1,C2,C3; 
} 
class MyArray{ 
    MyArray(Class<? extends Enum> e1,Class<? extends Enum> e2,Class<? extends Enum> e3) { 
     strings=new String[e1.getEnumConstants().length][e1.getEnumConstants().length][e2.getEnumConstants().length]; 
     e3.getEnumConstants(); 
    } 
    void set(enumA a,enumB b,enumC c,String string) { 
     strings[a.ordinal()][b.ordinal()][c.ordinal()]=string; 
    } 
    String get(enumA a,enumB b,enumC c) { 
     return strings[a.ordinal()][b.ordinal()][c.ordinal()]; 
    } 
    public String toString() { 
     StringBuffer sb=new StringBuffer(); 
     for(enumA a:enumA.values()) 
      for(enumB b:enumB.values()) { 
       for(enumC c:enumC.values()) { 
        sb.append(get(a,b,c)); 
        sb.append('\n'); 
       } 
       sb.append('\n'); 
      } 
     return sb.toString(); 
    } 
    public static void main(String[] arguments) { 
     MyArray myArray=new MyArray(enumA.class,enumB.class,enumC.class); 
     for(enumA a:enumA.values()) 
      for(enumB b:enumB.values()) 
       for(enumC c:enumC.values()) 
        myArray.set(a,b,c,""+a+b+c); 
     System.out.println(myArray); 
    } 
    final String[][][] strings; 
} 
+0

確實是一種非常有趣的方法。結構的初始化更簡單... – JVerstry 2011-05-30 03:59:14

-1

我不認爲你已經理解了Java中的枚舉概念;它就像任何其他類型一樣。如果您必須將其視爲一個類,則對於Java中的所有枚舉,擴展爲java.lang.Enum。因此,你可以組成枚舉數組(或至少它們的值/常量,如果你這是你的意思)。看看下面的例子:

package com.example; 

public class Enumerations { 

    public enum enumA { A1, A2, A3 }; 
    public enum enumB { B1, B2, B3 }; 
    public enum enumC { C1, C2, C3 }; 

    private void test() { 
     Enumerations.enumA[] enumerations = new Enumerations.enumA[3]; 
     enumerations[0] = enumA.A1; 
     enumerations[1] = enumA.A2; 
     enumerations[2] = enumA.A3; 
    } 
} 

你不能在陣列中混合與其他類型的枚舉,如果這是你的意思。換句話說,您不能創建具有不同類型的多維數組:數組的類型與聲明中指定的類型相同;這樣聲明包含枚舉的數組不能包含字符串,即使它是多維的。因此,下面的片段是非法的:

package com.example; 

public class Enumerations { 

    public enum enumA { A1, A2, A3 }; 
    public enum enumB { B1, B2, B3 }; 
    public enum enumC { C1, C2, C3 }; 

    private void test() { 
     Enumerations.enumA[][] enumerations = new Enumerations.enumA[3][]; 
     enumerations[0][1] = enumA.A1; //legal 
     enumerations[0][2] = enumB.B1; //illegal since enumB is a different type 
    } 

至於你原來的問題而言,使用EnumMap的密鑰是枚舉通過以下方式進行:

private void createAndStoreEnum() { 
     EnumMap<Enumerations.enumA, String> aMap = new EnumMap<Enumerations.enumA, String>(enumA.class); 
     aMap.put(enumA.A1, "Example"); 
} 

的EnumMap的構造函數中使用,要求(用作鍵的枚舉的類型)作爲參數傳入。然後可以像其他任何地圖一樣使用它,並使用標準的語義和語義。

+0

我想要實現的是訪問字符串的枚舉類型或數組等。這不是1級枚舉。它是一個多級枚舉。可能這是不可能的... – JVerstry 2011-05-30 00:57:43

+0

@JVerstry,我想我已經在一定程度上理解了你的問題。我編輯了我的答案,以證明爲什麼數組在這裏不起作用。我認爲你需要使用enumMap。希望這個片段能讓你開始。 – 2011-05-30 01:04:42

+0

@JVerstry,我看着你的代碼在這個問題上。你如何試圖將多級枚舉映射到字符串?我認爲使用包含EnumMaps的HashMap會是錯誤方向上的一步。 – 2011-05-30 01:11:10

2

不應該是EnumMap<EnumA, EnumMap<EnumB, EnumMap<EnumC, String>>>?在這種情況下,你會做

EnumMap<...> enumMapC = new EnumMap<...>(); 
enumMapC.put(EnumC.VALUE, "SomeString"); 
EnumMap<...> enumMapB = new EnumMap<...>(); 
enumMapB.put(EnumB.VALUE, enumMapC); 
EnumMap<...> enumMapA = new EnumMap<...>(); 
enumMapA.put(EnumA.VALUE, enumMapB); 

雖然我會建議你使用一個好的IDE來編碼。你可能想考慮創建一些類,而不是直接使用EnumMap來使它更易於管理。

如果您使用數組中的所有位置,則可能需要使用枚舉的序號值作爲正常數組中的索引。

+0

你可能是對的,我正在測試一些東西... – JVerstry 2011-05-30 01:07:24

1

公共類整蠱{

public enum enumA { A1, A2, A3 }; 
public enum enumB { B1, B2, B3 }; 
public enum enumC { C1, C2, C3 }; 

HashMap<Object[],String> item = new HashMap<Object[],String>(); 

public Tricky() { 
    item.put(new Object[] {enumA.A1, enumB.B2, enumC.C3}, "A1_B2_C3 string"); 
    String oops = item.get(new Object[] {enumA.A2, enumB.B3, enumC.C1}); 
} 

}

這是相當醜陋的代碼。爲了清理它(並提供某種類型的安全性),您可以定義自己的類來保存枚舉的三元組,每個枚舉類型都有一個,並定義它的方法hashcodeequals。您也可以找到有用的方法Arrays.hashcode(Object[])

+0

這是一個肯定的想法...謝謝! – JVerstry 2011-05-30 01:09:13

0

好的,這裏是基於@owlstead提出的建議的解決方案。它的工作原理:

public class Tricky { 

    public enum enumA { A1, A2, A3 }; 
    public enum enumB { B1, B2, B3 }; 
    public enum enumC { C1, C2, C3 }; 

    static EnumMap<enumA,EnumMap<enumB,EnumMap<enumC,String>>> items; 

    public static void main(String[] args) { 

     // Creating my array (enum) of array (enum) of array (enum) of strings 
     items = new EnumMap<enumA, 
         EnumMap<enumB, 
          EnumMap<enumC,String>>>(
           enumA.class); 

     // We need to add entries 
     for (enumA itemA : enumA.values()) { 

      EnumMap<enumB, 
       EnumMap<enumC,String>> itemsB = 
        new EnumMap<enumB, 
         EnumMap<enumC,String>>(enumB.class); 

      // And sub-entries... 
      for (enumB itemB : enumB.values()) 
       itemsB.put(itemB, new EnumMap<enumC,String>(enumC.class)); 

      items.put(itemA, itemsB); 

     } 

     // Putting a value 
     items.get(enumA.A2).get(enumB.B3).put(enumC.C1, "MyValue"); 

     // Retrieving a value 
     String retr = items.get(enumA.A2).get(enumB.B3).get(enumC.C1); 
     String retr2 = items.get(enumA.A3).get(enumB.B3).get(enumC.C2); 

     System.out.println(retr); 
     System.out.println(retr2); 

    } 

} 
+0

當我醒來時,我正在考慮這個問題,我想你可能想創建一個不可變的類來保存字段中所有三個枚舉的值,編寫一個好的equals()和hash()方法,然後使用該類作爲HashMap 中的鍵。但這只是一個暗示,而不是對你的問題的直接回答。 – 2011-05-30 15:22:16

+0

@owlstead你提出的建議確實是一個解決方案,但是它引發了一個額外的課程。我終於實現了類似Ray的提議。對於相同的功能它更簡單。謝謝。 – JVerstry 2011-05-30 20:28:22