55

列挙値の ArrayList を作成 (および操作) することは可能ですか? 例えば:

enum MyEnum
{
   ONE, TWO
}

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

6 に答える 6

144

あなたは単に書くことができます

new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
于 2012-10-28T14:28:27.567 に答える
40

tl;dr

列挙型からオブジェクトのコレクションを作成および編集できますか? はい。

順序を気にしない場合は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. 

詳細

EnumSetAmit Deshpandeの回答( ).valuesと Marko Topolnik の回答 ( ) はどちらも正しいです。ここにもう少し情報があります。

Enum.values

.values()メソッドは、コンパイラによって追加された で暗黙的に宣言されたメソッドです。Enumではなく、大まかな配列を生成しCollectionます。確かに使える。

ドキュメントに関する特記事項:暗黙的に宣言されたメソッドとしては異例であるため、この.values()メソッドはクラスのメソッドの中にリストされていません。EnumこのメソッドはJava 言語仕様で定義されており、 のドキュメントで言及されていEnum.valueOfます。

EnumSet– 速くて小さい

EnumSet含める利点:

  • 極端な速度。
  • メモリのコンパクトな使用。

クラスのドキュメントを引用するには:

列挙型セットは、内部的にビット ベクトルとして表されます。この表現は非常にコンパクトで効率的です。このクラスの空間と時間のパフォーマンスは、従来の int ベースの「ビット フラグ」に代わる高品質でタイプセーフな代替手段として使用できるほど十分に優れている必要があります。引数が列挙型セットでもある場合は、一括操作 (containsAll やretainAll など) も非常に高速に実行されます。

この列挙型を考えると:

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

EnumSet1 行で作成します。

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

コンソールにダンプします。

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

allAnimals : [犬、猫、鳥、コウモリ]

enum オブジェクトのサブセットからセットを作成します。

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

クラスのドキュメントを参照して、要素の追加や削除など、コレクションを操作するさまざまな方法を確認してください。

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

自然秩序

ドキュメントは、EnumSet の Iterator が自然な順序、つまり列挙型の値が最初に宣言された順序であることを約束します。

クラスのドキュメントを引用するには:

iterator メソッドによって返される反復子は、自然な順序 (列挙定数が宣言されている順序) で要素をトラバースします。

率直に言って、この約束を考えると、なぜこれがSortedSet. でもまぁ、まあ、まあいいか。List必要に応じて からを作成できますSetCollectionanyをコンストラクターに渡すArrayListと、そのコレクションIteratorが自動的に呼び出されます。

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

コンソールにダンプします。

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

走るとき。

list : [DOG, CAT, BIRD, BAT]

Java 10 以降ではListEnumSet. 新しいリストの順序は、の反復子の順序になりEnumSetます。の反復子EnumSetの順序は、列挙の要素オブジェクトがその列挙で定義された順序です。

List< Animal > nonModList = List.copyOf( allAnimals ) ;  // Or pass Animals.values() 
于 2015-09-02T21:49:52.090 に答える
24

はい、それは間違いなく可能ですが、実行する必要があります

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

alその後、要素を:al.add(ONE)またはに追加できますal.add(TWO)

于 2012-10-28T14:14:33.617 に答える
12

可能ですが、EnumSet代わりに使用する必要があります

enum MyEnum {
    ONE, TWO;
    public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
}
于 2012-10-28T14:15:48.787 に答える
1

列挙型はJavaの単なる別のクラスであり、可能でなければなりません。

より正確には、列挙型はオブジェクトのインスタンスです: http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html

はい、それはうまくいくはずです。

于 2012-10-28T14:10:22.920 に答える
0

これは、より一般的なソリューションであり、任意の 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);
于 2013-11-22T15:35:08.777 に答える