列挙型の値のArrayListを作成(および操作)することは可能ですか?例:javaのenum値のリスト
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
列挙型の値のArrayListを作成(および操作)することは可能ですか?例:javaのenum値のリスト
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
はい、それは間違いなく可能ですが、あなたはその後、al
に要素を追加することができます
List<MyEnum> al = new ArrayList<MyEnum>();
行う必要があります:al.add(ONE)
またはal.add(TWO)
を。
enumはJavaの別のクラスです。これは可能です。
より正確には、列挙型は、オブジェクトのインスタンスである:http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html
そうです、それが動作するはずです。
あなたは、単にこれは、それはとても自由で、任意の列挙型のオブジェクトに対して使用することができ、より汎用的なソリューションです
new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
誰かがなぜこの「選択された答え」ではないのか説明していますか? – Debriter
選択された答えがこれと同じくらい良いので、私は推測します。 –
書くことができますEnumSet
を使用する必要がありますの使用。
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()はenumのCollectionを取得する方がはるかに簡単なアプローチだと思います。 –
The Answer(EnumSet
)アミット・デシュパンデとthe Answer(.values
)でマルコTopolnikによっては両方正しいです。もう少し情報があります。
.values()
方法は、コンパイラによって追加Enum
上暗黙的に宣言されたメソッド、です。 Collection
ではなく粗配列を生成します。確かに使える。ドキュメントに関する
特記事項:暗黙的に宣言されたメソッドとして異例なので、.values()
方法がEnum
クラスのメソッドの中で記載されていません。方法はdefined in the Java Language Specificationであり、Enum.valueOf
の文書に記載されています。 EnumSet
へ
五分五分は、次のとおりです。
クラスのドキュメントを引用する:
列挙セットはビットベクトルとして内部的に表現されています。この表現は非常にコンパクトで効率的です。このクラスのスペースと時間のパフォーマンスは、従来のintベースの「ビットフラグ」に代わる、高品質でタイプセーフな代替としての使用に十分適しているはずです。「彼らの引数もenumセットであれば(例えばのcontainsAllとのretainAllなど)でさえバルク操作は非常に迅速に実行する必要があります。この列挙型を考えると
:。
enum Animal
{
DOG , CAT , BIRD , BAT ;
}
EnumSet
1でラインを作る
EnumSet<Animal> allAnimals = EnumSet.allOf(Animal.class);
がコンソールにダンプします。
System.out.println("allAnimals : " + allAnimals);
を
allAnimals:[犬、猫、鳥、BAT]
がenumオブジェクトのサブセットからセットしてください。
EnumSet<Animal> flyingAnimals = EnumSet.of(BIRD , BAT);
は、要素の追加や削除などのコレクションを操作するための多くの方法を見てthe class docを見てください。
EnumSet<Animal> featheredFlyingAnimals =
EnumSet.copyOf(flyingAnimals).remove(BAT);
ドキュメントがEnumSetのためのIteratorを約束し、自然な順序で列挙の値が最初に宣言された順序です。
iteratorメソッドによって返される反復子は、彼らの自然な順序(enum定数の宣言された順)内の要素を横断:
は、クラスのドキュメントを引用します。
この約束を前に、私はなぜこれが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