2012-10-28 19 views
33

列挙型の値のArrayListを作成(および操​​作)することは可能ですか?例:javaのenum値のリスト

enum MyEnum 
{ 
    ONE, TWO 
} 

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

答えて

17

はい、それは間違いなく可能ですが、あなたはその後、alに要素を追加することができます

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

行う必要があります:al.add(ONE)またはal.add(TWO)を。

+1

これは空のリストを返します。 –

+0

@BasilBourque質問の解釈によります。私は明確な編集をしました。 – arshajii

10

ことは可能ですが、その代わり

enum MyEnum { 
    ONE, TWO; 
    public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO); 
} 
+4

なぜ 'EnumSet'を使うべきですか? OPが注文リストを望む場合はどうすればよいですか? – arshajii

+0

ええ、EnumSetを試しますが、ArrayListについて興味があります。 – Alf

+3

@ A.R.S。 EnumSetの要素は自然な順序です。 –

88

あなたは、単にこれは、それはとても自由で、任意の列挙型のオブジェクトに対して使用することができ、より汎用的なソリューションです

new ArrayList<MyEnum>(Arrays.asList(MyEnum.values())); 
+1

誰かがなぜこの「選択された答え」ではないのか説明していますか? – Debriter

+0

選択された答えがこれと同じくらい良いので、私は推測します。 –

2

書くことができます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); 
+1

これは非常に複雑すぎて、型保護を提供しません( 'enum'型がJavaに追加された理由の一部)。 – squid314

+1

私はenum.values()はenumのCollectionを取得する方がはるかに簡単なアプローチだと思います。 –

10

The AnswerEnumSet)アミット・デシュパンデと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を作成することができます。任意のCollectionArrayListのコンストラクタに渡し、そのコレクションのIteratorが自動的に呼び出されます。

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

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

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

実行時。

list : [DOG, CAT, BIRD, BAT] 
+0

この回答に大きな洞察力があります! – Alfabravo

関連する問題