是否有可能創建枚舉值ArrayList(並操縱它)?例如:java中的枚舉值列表
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
是否有可能創建枚舉值ArrayList(並操縱它)?例如:java中的枚舉值列表
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
是的,它是絕對有可能的,但你必須做
List<MyEnum> al = new ArrayList<MyEnum>();
然後,您可以添加元素al
:al.add(ONE)
或al.add(TWO)
。
枚舉只是Java中的另一個類,應該是可以的。
更準確的說,一個枚舉是對象的一個實例:http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html
所以,是的,它應該工作。
你可以簡單地寫
new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
有人解釋爲什麼這不是「選擇的答案」? – Debriter
因爲所選的答案和我猜的一樣好。 –
這是一個更通用的解決方案,可以被用於任何枚舉對象,所以是免費的的使用。現在
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);
這太過複雜了,並且不提供任何類型的保護(這是'enum'類型被添加到Java的部分原因)。 – squid314
我認爲enum.values()是一個更簡單的方法來獲取你的枚舉集合。 –
The Answer(EnumSet
)由阿米特德什潘德和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]
在這個答案偉大的洞察力! – Alfabravo
這會爲我返回一個空的列表。 –
@BasilBourque它取決於問題的解釋。我做了一個澄清的編輯。 – arshajii