[英]List of enum values in java
是否可以創建枚舉值的 ArrayList(並對其進行操作)? 例如:
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
你可以簡單地寫
new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
您可以從枚舉中創建和編輯對象集合嗎? 是的。
如果您不關心順序,請使用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.
Amit Deshpande的答案( EnumSet
) 和 Marko Topolnik的答案( .values
) 都是正確的。 這是更多信息。
Enum.values
.values()
方法是Enum
上隱式聲明的方法,由編譯器添加。 它產生一個粗略的數組而不是一個Collection
。 當然可以使用。
關於文檔的特別說明:作為隱式聲明的方法不尋常, .values()
方法未列在Enum
類的方法中。 該方法在Java Language Specification中定義,並在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
。 但是,哦,好吧,足夠好了。 如果需要,我們可以從Set
創建一個List
。 將任何Collection
傳遞給ArrayList
的構造函數,該集合的Iterator
會自動代表您調用。
List<Animal> list = new ArrayList<>( allAnimals );
轉儲到控制台。
System.out.println("list : " + list );
跑的時候。
list : [DOG, CAT, BIRD, BAT]
在 Java 10 及更高版本中,您可以通過傳遞EnumSet
方便地創建不可修改的List
。 新列表的順序將按照EnumSet
的迭代器順序。 EnumSet
的迭代器順序是在該枚舉上定義枚舉的元素對象的順序。
List< Animal > nonModList = List.copyOf( allAnimals ) ; // Or pass Animals.values()
是的,這絕對是可能的,但你必須這樣做
List<MyEnum> al = new ArrayList<MyEnum>();
然后,您可以將元素添加到al
: al.add(ONE)
或al.add(TWO)
。
這是可能的,但您應該改用EnumSet
enum MyEnum {
ONE, TWO;
public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
}
枚舉只是 Java 中的另一個類,它應該是可能的。
更准確地說,枚舉是對象的一個實例:http: //docs.oracle.com/javase/6/docs/api/java/lang/Enum.html
所以是的,它應該工作。
這是一個更通用的解決方案,可用於任何 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);
這里是:
enum MyEnum
{
ONE, TWO;
public List<MyEnum> getEnumValues(){
return new ArrayList<MyEnum>(Arrays.asList(values()));
}
}
您可以通過以下方式訪問它:
List<MyEnum> theValues = MyEnum.getEnumValues();
//Iterate through it..
for(MyEnum e : theValues){
System.out.println(e.name);
}
輸出:
ONE
TWO
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.