用Java中的所有枚举值填充列表


80

我想用一个枚举的所有可能值来填充列表
自从我最近爱上了EnumSet,我就利用了allOf()

EnumSet<Something> all = EnumSet.allOf( Something.class);
List<Something> list = new ArrayList<>( all.size());
for (Something s : all) {
    list.add( s);
}
return list;

是否有更好的方法(如在未混淆的衬管中)达到相同的结果?


ArrayList <Something> list = new ArrayList <Something>(Arrays.asList(Something.values()))
TacB0sS 2014年

Answers:


168

我不会在一开始就使用列表,因为EnumSet更合适,但是您可以

List<Something> somethingList = Arrays.asList(Something.values());

要么

List<Something> somethingList =
                 new ArrayList<Something>(EnumSet.allOf(Something.class));

3
有时EnumSet不会削减它。特别是在订单重要时
MonoThreaded 2013年

1
@MonoThreaded您想到的是什么顺序?EnumSet按枚举的自然顺序排列。该列表与集合的顺序相同,因此在这里使用List不会改变任何内容。
彼得·劳瑞

1
抱歉,此问题超出了订购范围。我相信您在第一个示例中是指values()。
MonoThreaded 2013年

@PeterLawrey我们一直使用Enums。在设计工作流程时,批准过程可能不会在Natural OrderEnum中进行,这就是为什么a相List<Enum>对于an派上用场的原因EnumSet
buzzsawddog 2014年


10

有一个构造函数ArrayList

ArrayList(Collection<? extends E> c) 

现在,EnumSet扩展,AbstractCollection以便您可以做

ArrayList<Something> all = new ArrayList<Something>(enumSet)

8

尝试

enum E {
    E1, E2, E3
}

public static void main(String[] args) throws Exception {
    List<E> list = Arrays.asList(E.values());
    System.out.println(list);
}

布局丑陋但方法不错:)
MonoThreaded 2013年

值得澄清的是,您不能从中得到java.util.ArrayList,如问题所述
planetjones

@MonoThreaded怎么丑?您得到了想要的
死侍

1
List<Something> result = new ArrayList<Something>(all);

EnumSet是Java集合,因为它实现了Set接口:

public interface Set<E> extends Collection<E> 

因此,您可以对集合执行的任何操作都可以对进行操作EnumSet


0

这更具可读性:

Object[] allValues = all.getDeclaringClass().getEnumConstants();

1
那你可以做Something.class.getEnumConstants()对吗?
shyam

1
...或Something.values();
彼得·劳瑞

0

试试这个:

... = new ArrayList<Something>(EnumSet.allOf(Something.class));

作为ArrayList具有的构造函数Collection<? extends E>。但是,仅当您确实要使用时才使用此方法EnumSet

所有枚举都可以使用该方法values()。它返回所有枚举值的数组:

... = Arrays.asList(Something.values());


-2
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.