java中的枚举值列表

Alf*_*Alf 45 java enums

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

enum MyEnum
{
   ONE, TWO
}

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

Mar*_*nik 116

你可以简单地写

new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
Run Code Online (Sandbox Code Playgroud)

  • 有人解释为什么这不是"选择的答案"? (5认同)
  • 这不是“选择的答案”,因为此答案在接受的答案之后14分钟出现,并且接受的答案从未更改。 (2认同)

Bas*_*que 26

答案(EnumSet)由阿米特德什潘德和应答(.values由马尔科Topolnik)都是正确的.这里有更多信息.

Enum.values

.values()方法是一种隐式声明的方法Enum,由编译器增加.它生成一个粗糙的数组而不是一个Collection.当然可用.

关于文档的特别说明:作为隐式声明的方法不常见,该.values()方法Enum类的方法中列出.该方法Java语言规范中定义,并在doc for doc中提及Enum.valueOf.

EnumSet - 快速和小

好处EnumSet包括:

  • 极速.
  • 紧凑使用内存.

引用课程文档:

枚举集在内部表示为位向量.这种表现非常紧凑和高效.这个类的空间和时间性能应该足够好,以允许它作为传统的基于int的"位标志"的高质量,类型安全的替代品.如果它们的参数也是枚举集,即使批量操作(例如containsAll和retainAll)也应该非常快速地运行.

鉴于这个枚举:

enum Animal
{
    DOG , CAT , BIRD , BAT ;
}
Run Code Online (Sandbox Code Playgroud)

EnumSet一个一行.

EnumSet<Animal> allAnimals = EnumSet.allOf( Animal.class );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println( "allAnimals : " + allAnimals );
Run Code Online (Sandbox Code Playgroud)

allAnimals:[DOG,CAT,BIRD,BAT]

从枚举对象的子集创建一个集合.

EnumSet<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );
Run Code Online (Sandbox Code Playgroud)

查看类doc以查看操作集合的许多方法,包括添加或删除元素.

EnumSet<Animal> featheredFlyingAnimals = 
    EnumSet.copyOf( flyingAnimals ).remove( BAT );
Run Code Online (Sandbox Code Playgroud)

自然秩序

doc承诺EnumSet的Iterator是自然顺序的,即枚举值最初声明的顺序.

引用课程文档:

迭代器方法返回的迭代器以其自然顺序(枚举常量声明的顺序)遍历元素.

坦率地说,鉴于这个承诺,我很困惑为什么这不是一个SortedSet.但是,哦,好吧,足够好.我们可以创建一个ListSet如果需要的话.将any传递Collection给构造函数,ArrayListIterator代表您自动调用该集合.

List<Animal> list = new ArrayList<>( allAnimals );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println("list : " + list );
Run Code Online (Sandbox Code Playgroud)

跑步时

list : [DOG, CAT, BIRD, BAT]
Run Code Online (Sandbox Code Playgroud)

在Java 10及更高版本中,您可以List通过传递方便地创建一个不可修改的EnumSet.

List< Animal > nonModList = List.copyOf( allAnimals ) ;  // Or pass Animals.values() 
Run Code Online (Sandbox Code Playgroud)


ars*_*jii 22

是的,这绝对是可能的,但你必须这样做

List<MyEnum> al = new ArrayList<MyEnum>();
Run Code Online (Sandbox Code Playgroud)

然后,您可以将元素添加到al:al.add(ONE)al.add(TWO).


Ami*_*nde 11

这是可能的,但你应该使用EnumSet,而不是

enum MyEnum {
    ONE, TWO;
    public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么要使用`EnumSet`?如果OP需要有序列表怎么办? (5认同)
  • EnumSet也是一个Set,因此不能包含重复项. (5认同)
  • `EnumSet`中的@ARS元素按自然顺序排列.检查java doc (3认同)
  • @AmitD是的但没有办法按照自然顺序对它们进行不同的排序,就像使用`ArrayList`一样. (3认同)