如何将字符串项放在String枚举枚举的枚举映射中?

时间:2011-05-30 00:39:07

标签: java enums map enum-map

我想创建一个数组(枚举)数组(枚举)的数组(枚举)。我不认为用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?


    }
}

以上代码编译,但我如何在地图中放置和获取字符串项?

5 个答案:

答案 0 :(得分: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来使其更易于管理。

如果使用数组中的所有位置,您可能希望使用枚举的序数值作为普通数组的索引。

答案 1 :(得分:1)

公共课Tricky {

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[])很有用。

答案 2 :(得分: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;
}

答案 3 :(得分: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);

    }

}

答案 4 :(得分:-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构造函数需要将(用作键的枚举)类型作为参数传入。然后它可以像任何其他地图一样使用标准的put和get语义。