列挙値の 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.
EnumSet
Amit 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 ;
}
をEnumSet
1 行で作成します。
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
必要に応じて からを作成できますSet
。Collection
anyをコンストラクターに渡すArrayList
と、そのコレクションIterator
が自動的に呼び出されます。
List<Animal> list = new ArrayList<>( allAnimals );
コンソールにダンプします。
System.out.println("list : " + list );
走るとき。
list : [DOG, CAT, BIRD, BAT]
Java 10 以降ではList
、EnumSet
. 新しいリストの順序は、の反復子の順序になり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);