2012-10-28 45 views
33

是否有可能創建枚舉值ArrayList(並操縱它)?例如:java中的枚舉值列表

enum MyEnum 
{ 
    ONE, TWO 
} 

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

回答

17

是的,它是絕對有可能的,但你必須做

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

然後,您可以添加元素alal.add(ONE)al.add(TWO)

+1

這會爲我返回一個空的列表。 –

+0

@BasilBourque它取決於問題的解釋。我做了一個澄清的編輯。 – arshajii

10

這是可能的,但你應該使用EnumSet代替

enum MyEnum { 
    ONE, TWO; 
    public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO); 
} 
+4

爲什麼要使用EnumSet?如果OP想要一個有序列表會怎麼樣? – arshajii

+0

是的,會嘗試EnumSet,但只是好奇ArrayList。 – Alf

+3

@ A.R.S。 'EnumSet'中的元素是自然順序的。檢查java doc –

88

你可以簡單地寫

new ArrayList<MyEnum>(Arrays.asList(MyEnum.values())); 
+1

有人解釋爲什麼這不是「選擇的答案」? – Debriter

+0

因爲所選的答案和我猜的一樣好。 –

2

這是一個更通用的解決方案,可以被用於任何枚舉對象,所以是免費的的使用。現在

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); 
+1

這太過複雜了,並且不提供任何類型的保護(這是'enum'類型被添加到Java的部分原因)。 – squid314

+1

我認爲enum.values()是一個更簡單的方法來獲取你的枚舉集合。 –

10

The AnswerEnumSet)由阿米特德什潘德和the Answer.values)由馬爾科Topolnik都是正確的。這裏有一些信息。

.values()方法是一個隱式聲明的方法Enum,由編譯器添加。它生成一個粗略的數組而不是Collection。當然可用。

有關文件特別說明:作爲尋常,因爲一個隱式聲明的方法,該.values()方法是不上Enum類的方法之列。該方法是defined in the Java Language Specification,並在文檔中提到Enum.valueOf

快速&小

的到EnumSet上升空間包括:

  • 極限速度。
  • 緊湊型內存使用。

引述類DOC:

枚舉套在內部表示爲位向量。這種表示非常緊湊和高效。這個類的空間和時間性能應該足夠好,以允許它用作傳統的基於int的「比特標誌」的高質量,類型安全的替代品。「即使是批量操作(如containsAll和retainAll)也應運行速度非常快,如果他們的說法也是一個枚舉set

鑑於此枚舉:。

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

在一行中做一個EnumSet

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

轉儲到控制檯。

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

allAnimals:狗,貓,鳥,BAT]

建立從枚舉對象的子集的一組。

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

查看the class doc查看操作集合的多種方法,包括添加或刪除元素。

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

自然順序

的文檔承諾爲EnumSet迭代器是自然順序,其中枚舉值最初聲明的順序。

引述類DOC:

iterator方法返回的迭代遍歷在其自然順序(其中枚舉常數聲明的順序)的元素。

坦率地說,鑑於這個承諾,我很困惑,爲什麼這不是一個SortedSet。但是,哦,夠好了。如果需要,我們可以從Set創建一個List。將任何Collection傳遞給ArrayList的構造函數,並且代表您自動調用該集合的Iterator

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

轉儲到控制檯。

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

運行時。

list : [DOG, CAT, BIRD, BAT] 
+0

在這個答案偉大的洞察力! – Alfabravo