是否可以创建枚举值的ArrayList(并对其进行操作)?例如:
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
答案 0 :(得分:109)
你可以简单地写
new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
答案 1 :(得分:21)
The Answer(EnumSet
)和Marko Topolnik的the Answer(.values
)都是正确的。这里有更多信息。
Enum.values
.values()
方法是Enum
上的隐式声明的方法,由编译器添加。它生成一个粗数组而不是Collection
。当然可用。
关于文档的特别说明:作为隐式声明的方法不常见,.values()
方法在<{1}}的方法中列出 类。该方法为defined in the Java Language Specification,并在Enum.valueOf
的文档中提及。
Enum
- 快速&amp;小 EnumSet
的好处包括:
引用类doc:
枚举集在内部表示为位向量。这种表现非常紧凑和高效。这个类的空间和时间性能应该足够好,以允许它作为传统的基于int的“位标志”的高质量,类型安全的替代品。即使批量操作(例如containsAll和retainAll)如果它们的参数也是枚举集也应该非常快速地运行。
鉴于此枚举:
EnumSet
在一行中设置enum Animal
{
DOG , CAT , BIRD , BAT ;
}
。
EnumSet
转储到控制台。
EnumSet<Animal> allAnimals = EnumSet.allOf( Animal.class );
allAnimals:[DOG,CAT,BIRD,BAT]
从枚举对象的子集中创建一个集合。
System.out.println( "allAnimals : " + allAnimals );
查看the class doc以查看操作集合的多种方法,包括添加或删除元素。
EnumSet<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );
doc承诺EnumSet的迭代器是自然顺序的,即枚举值最初声明的顺序。
引用类doc:
坦率地说,鉴于这个承诺,我很困惑为什么这不是迭代器方法返回的迭代器以自然顺序遍历元素(枚举常量的声明顺序)。
SortedSet
。但是,哦,好吧,足够好。如果需要,我们可以从EnumSet<Animal> featheredFlyingAnimals =
EnumSet.copyOf( flyingAnimals ).remove( BAT );
创建List
。将Set
传递给Collection
的构造函数,代表您自动调用该集合的Iterator
。
ArrayList
转储到控制台。
List<Animal> list = new ArrayList<>( allAnimals );
跑步时。
System.out.println("list : " + list );
在Java 10及更高版本中,您可以通过传递list : [DOG, CAT, BIRD, BAT]
来方便地创建不可修改的List
。
EnumSet
答案 2 :(得分:20)
是的,这绝对是可能的,但你必须这样做
List<MyEnum> al = new ArrayList<MyEnum>();
然后,您可以将元素添加到al
:al.add(ONE)
或al.add(TWO)
。
答案 3 :(得分:11)
可以,但您应该使用EnumSet
代替
enum MyEnum {
ONE, TWO;
public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
}
答案 4 :(得分:2)
这是一个更通用的解决方案,可用于任何Enum对象,因此无需使用。
static public List<Object> constFromEnumToList(Class enumType) {
List<Object> nueva = new ArrayList<Object>();
if (enumType.isEnum()) {
try {
Class<?> cls = Class.forName(enumType.getCanonicalName());
Object[] consts = cls.getEnumConstants();
nueva.addAll(Arrays.asList(consts));
} catch (ClassNotFoundException e) {
System.out.println("No se localizo la clase");
}
}
return nueva;
}
现在你必须这样打电话:
constFromEnumToList(MiEnum.class);
答案 5 :(得分:1)
枚举只是Java中的另一个类,它应该是可能的。
更准确地说,枚举是Object的一个实例:http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html
是的,它应该有效。