簡體   English   中英

java中的枚舉值列表

[英]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()));

tl;博士

您可以從枚舉中創建和編輯對象集合嗎? 是的。

如果您不關心順序,請使用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>();

然后,您可以將元素添加到alal.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM