55

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

enum MyEnum
{
   ONE, TWO
}

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

6 回答 6

144

你可以简单地写

new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
于 2012-10-28T14:28:27.567 回答
40

tl;博士

您可以从枚举中创建和编辑对象集合吗?是的。

如果您不关心顺序,请EnumSet使用Set.

enum Animal{ DOG , CAT , BIRD , BAT ; }

Set<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );

Set<Animal> featheredFlyingAnimals = flyingAnimals.clone().remove( BAT ) ;

如果您关心订单,请使用List诸如ArrayList. 例如,我们可以创建一个人在选择宠物时的偏好列表,按照他们最喜欢的顺序排列。

List< Animal > favoritePets = new ArrayList<>() ;
favoritePets.add( CAT ) ;  // This person prefers cats over dogs…
favoritePets.add( DOG ) ;  // …but would accept either.
                           // This person would not accept a bird nor a bat.

对于不可修改的有序列表,请使用List.of.

List< Animal > favoritePets = List.of( CAT , DOG ) ;  // This person prefers cats over dogs, but would accept either. This person would not accept a bird nor a bat. 

细节

EnumSetAmit Deshpande的答案( )和 Marko Topolnik 的答案( .values) 都是正确的。这是更多信息。

Enum.values

.values()方法是一个隐式声明的方法on Enum,由编译器添加。它产生一个粗略的数组而不是一个Collection. 当然可以使用。

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

EnumSet– 快而小

好处EnumSet包括:

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

引用类文档:

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

鉴于此枚举:

enum Animal
{
    DOG , CAT , BIRD , BAT ;
}

做一个EnumSet在一条线上。

Set<Animal> allAnimals = EnumSet.allOf( Animal.class );

转储到控制台。

System.out.println( "allAnimals : " + allAnimals );

allAnimals : [狗、猫、鸟、蝙蝠]

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

Set<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );

查看类文档以了解操作集合的许多方法,包括添加或删除元素。

Set<Animal> featheredFlyingAnimals = 
    EnumSet.copyOf( flyingAnimals ).remove( BAT );

自然秩序

该文档承诺 EnumSet 的迭代器是自然顺序的,即最初声明枚举值的顺序。

引用类文档:

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

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

List<Animal> list = new ArrayList<>( allAnimals );

转储到控制台。

System.out.println("list : " + list );

跑的时候。

list : [DOG, CAT, BIRD, BAT]

在 Java 10 及更高版本中,您可以List通过传递EnumSet. 新列表的顺序将按照EnumSet. an 的迭代器顺序EnumSet是枚举的元素对象在该枚举上定义的顺序。

List< Animal > nonModList = List.copyOf( allAnimals ) ;  // Or pass Animals.values() 
于 2015-09-02T21:49:52.090 回答
24

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

List<MyEnum> al = new ArrayList<MyEnum>();

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

于 2012-10-28T14:14:33.617 回答
12

这是可能的,但您应该EnumSet改用

enum MyEnum {
    ONE, TWO;
    public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
}
于 2012-10-28T14:15:48.787 回答
1

枚举只是 Java 中的另一个类,它应该是可能的。

更准确地说,枚举是对象的一个​​实例:http: //docs.oracle.com/javase/6/docs/api/java/lang/Enum.html

所以是的,它应该工作。

于 2012-10-28T14:10:22.920 回答
0

这是一个更通用的解决方案,可用于任何 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);
于 2013-11-22T15:35:08.777 回答