2016-07-14 11 views
5

私はEnumSetを持っており、基本論理要素の配列へ/から前後に変換します。それがうまく動作した場合、私はむしろ、基本論理要素よりも、アレイの代わりにList、および/またはBooleanオブジェクトを操作することができます。私は、もう一方の端に取得したい何変換は

enum MyEnum { DOG, CAT, BIRD; } 
EnumSet enumSet = EnumSet.of(MyEnum.DOG, MyEnum.CAT); 

は次のようになります配列です:

[TRUE, TRUE, FALSE] 

ここで、この質問は、この1、Convert an EnumSet to an array of integersに似ています。相違点:

  • (明らかに)ブールまたは整数の対Boolean
    • 私は列挙型のすべてのメンバーがEnumSetに含まれる各列挙要素のTRUEと除外されている各要素のFALSEで、表現することにしたいですEnumSetから。他の質問の配列には、EnumSetにある項目のみが含まれています。 (さらに重要なこと)
  • 答えて

    6

    あなたは基本的に以下の作成enumSet_に上記で作成したブール配列presentから、他の方向に行く

    MyEnum[] values = MyEnum.values(); // or MyEnum.class.getEnumConstants() 
    boolean[] present = new boolean[values.length]; 
    for (int i = 0; i < values.length; i++) { 
        present[i] = enumSet.contains(values[i]); 
    } 
    

    を書きたいことをすることができません。 Javaの8で

    EnumSet<MyEnum> enumSet_ = EnumSet.noneOf (MyEnum.class); // Instantiate an empty EnumSet. 
    MyEnum[] values_ = MyEnum.values(); 
    for (int i = 0 ; i < values_.length ; i ++) { 
        if (present[ i ]) { // If the array element is TRUE, add the matching MyEnum item to the EnumSet. If FALSE, do nothing, effectively omitting the matching MyEnum item from the EnumSet. 
         enumSet_.add (values_[ i ]); 
        } 
    } 
    
    +0

    感謝を使ってbooleanプリミティブの配列からEnumSetを取得します。私は好奇心のラムダ/ストリームの構文が好きでしたが、シンプルだが確かな昔ながらの構文を表示することは良いことです。 –

    +0

    私は配列からEnumSetに向かうために、別の方向に進むためのサンプルコードを書く自由を取った。このコードは、私のいくつかの作業コードに基づいていますが、ここであなたの例に合うように変更されています。私のコードがここに掲載されていれば100%ではない。 –

    +0

    @BasilBourque、 'QuarterHour'とは何ですか? – Andrew

    2

    あなたが存在するために、この

    IntStream.range(0, present.size()).filter(present::get).mapToObj(i -> MyEnum.values()[i]). 
        collect(Collectors.toCollection(() -> EnumSet.noneOf(MyEnum.class))); 
    
    4

    ような何かを行うことができ、私はしませんあなたの周りの他の道を行くために、この

    List<Boolean> present = Arrays.stream(MyEnum.values()).map(enumSet::contains).collect(Collectors.toList()); 
    

    ようにそれを行うことができますより良い解決策を見てください。

    Boolean[] b = Arrays.stream(MyEnum.values()).map(set::contains).toArray(Boolean[]::new); 
    

    To zip

    MyEnum[] enums = zip(Arrays.stream(MyEnum.values()), Arrays.stream(b), 
        (e, b) -> b ? e : null).filter(Objects::nonNull).toArray(MyEnum[]::new); 
    
    +1

    containsメソッドは列挙全体を反復処理しません。 containsメソッドは、EnumSet実装JumboEnumSetとRegularEnumSetの両方でオーバーライドされます。 –

    +1

    @DLevant、ありがとう、訂正しました – Andrew