我想创建一个数组(枚举)数组(枚举)的数组(枚举)。我不认为用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 :(得分: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});
}
}
这是非常难看的代码。要清理它(并提供一些类型安全性),您可以定义自己的类来保存枚举的三元组,每个枚举类型一个,并定义其hashcode
和equals
方法。您可能还会发现方法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语义。