2013-04-22 144 views
55

我想填充列表與枚舉
因爲我最近迷上了EnumSet的所有可能的值,我利用allOf()
java的填充值列表

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

是否有更好的方法(如在非混淆一個班輪),以達到相同的結果?

+0

ArrayList的名單=新的ArrayList (Arrays.asList(Something.values ())) – TacB0sS 2014-12-25 09:41:29

回答

115

首先我不會使用List S作爲一個EnumSet更approriate但你可以做

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

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

有時EnumSet不會剪切它。特別是當訂單很重要時 – MonoThreaded 2013-04-22 14:06:24

+1

@MonoThreaded你有什麼樣的訂單?枚舉集按照自然順序排列。該列表將與該集合的順序相同,因此使用列表不會在此更改任何內容。 – 2013-04-22 14:07:35

+1

對不起,訂購超出了這個問題的範圍。我相信你在第一個例子中的意思是values()。 – MonoThreaded 2013-04-22 14:17:09

0

這是一個比較可讀:

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

然後你可以簡單地執行'Something.class.getEnumConstants()'對嗎? – shyam 2013-04-22 14:05:58

+1

...或'Something.values();' – 2013-04-22 14:06:39

+0

好點。我的java顯然是生鏽的! – BlackVegetable 2013-04-22 14:07:13

9

沒有爲ArrayList一個構造函數,是

ArrayList(Collection<? extends E> c) 

現在,EnumSet延伸AbstractCollection,所以你可以做

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

EnumSet是一個Java集合,因爲它實現了Set接口:

public interface Set<E> extends Collection<E> 

所以你可以用一個EnumSet做的任何你可以做的任何事情。

6

嘗試

enum E { 
    E1, E2, E3 
} 

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

醜陋的佈局,但不錯的方法:) – MonoThreaded 2013-04-22 14:10:58

+0

值得澄清,你沒有得到一個java.util.ArrayList出來,如問題中所述 – planetjones 2013-04-22 14:15:34

0

試試這個:

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

ArrayListCollection<? extends E>構造。但只有在您真的想使用EnumSet時才使用此方法。

所有枚舉都可以訪問方法values()。它返回所有枚舉值的數組:

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

您還可以使用:

Collections.singletonList(Something.values())