0

文字列の配列(enum)の配列(enum)の配列(enum)を作成したいと思います。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?


    }
}

上記のコードはコンパイルできますが、マップに文字列アイテムを配置および取得するにはどうすればよいですか?

4

5 に答える 5

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 を直接使用する代わりに、いくつかのクラスを作成して、もう少し管理しやすくすることを検討することもできます。

配列内のすべての位置を使用する場合は、代わりに列挙型の序数の値を通常の配列へのインデックスとして使用することをお勧めします。

于 2011-05-30T00:57:10.480 に答える
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;
}
于 2011-05-30T03:27:47.643 に答える
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});
}

}

それはかなり醜いコードです。それをクリーンアップする (そしていくらかのタイプ セーフを提供する) ために、列挙型のそれぞれから 1 つずつ、列挙型のトリプレットを保持するための独自のクラスを定義し、そのメソッドhashcodeequalsメソッドを定義することができます。この方法がArrays.hashcode(Object[])役立つ場合もあります。

于 2011-05-30T01:03:25.130 に答える
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);

    }

}
于 2011-05-30T02:33:11.020 に答える
-1

Java での列挙の概念を理解していないと思います。他のタイプと同じです。Java extends のすべての列挙型について、必要に応じてクラスと見なしてください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 コンストラクターでは、(キーとして使用される列挙型の) 型を引数として渡す必要があります。その後、標準の put および get セマンティクスを使用して、他のマップと同様に使用できます。

于 2011-05-30T00:55:59.957 に答える