是否可以创建枚举值的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)
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
.但是,哦,好吧,足够好.我们可以创建一个List
从Set
如果需要的话.将any传递Collection
给构造函数,ArrayList
并Iterator
代表您自动调用该集合.
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)
归档时间: |
|
查看次数: |
117265 次 |
最近记录: |