java中的枚举值列表

时间:2012-10-28 14:09:35

标签: java enums

是否可以创建枚举值的ArrayList(并对其进行操作)?例如:

enum MyEnum
{
   ONE, TWO
}

MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);

6 个答案:

答案 0 :(得分:109)

你可以简单地写

new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));

答案 1 :(得分:21)

Amit Deshpande的

The AnswerEnumSet)和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>();

然后,您可以将元素添加到alal.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

是的,它应该有效。