2016-07-14 17 views
5

Ich habe eine EnumSet und möchte hin und her zu/von einem Array von booleschen Primitiven konvertieren. Wenn es besser funktioniert, könnte ich mit einem List anstelle eines Arrays und/oder Boolean Objekte statt Boolean Primitiven arbeiten.Konvertieren zwischen EnumSet und Array von booleschen Werten

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

Was will ich am anderen Ende bekommen, ist ein Array, das wie folgt aussieht:

[TRUE, TRUE, FALSE] 

Diese Frage ist hier ähnlich wie diese, Convert an EnumSet to an array of integers. Unterschiede:

  • boolean oder Boolean im Vergleich zu ganzen Zahlen (natürlich)
  • Ich möchte alle Mitglieder der Enumeration mit einem TRUE dargestellt, werden für jedes Enum Element in der EnumSet und ein FALSE für jedes Element enthalten, die ausgeschlossen ist von der EnumSet. Das Array der anderen Frage enthält nur die Elemente, die in der EnumSet gefunden werden. (Was noch wichtiger ist)

Antwort

6

zu tun, dass Sie im Grunde

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]); 
} 

gehen in die andere Richtung schreiben würde, von Booleschen Array present oben enumSet_ unten, erstellt.

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

Dank. Ich war neugierig auf die schickere Lambda/Streams-Syntax, aber es ist gut, die einfache, aber sichere altmodische Syntax zu zeigen. –

+0

Ich habe mir die Freiheit genommen, Beispielcode für die andere Richtung zu schreiben, von Array zu EnumSet. Dieser Code basiert auf etwas funktionierendem Code von mir, aber modifiziert, um Ihrem Beispiel hier zu entsprechen. Ich bin also nicht 100%, wenn mein hier veröffentlichter Code korrekt ist. –

+0

@BasilBourque, was ist 'QuarterHour'? – Andrew

2

In Java 8 Sie es wie diese

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

tun könnten, den anderen Weg zu gehen um Sie so etwas wie diese

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

Für die vorliegenden tun könnten, kann ich nicht siehe eine bessere Lösung als

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

An ein EnumSet aus einem Array von boolean Primitive erhalten, indem zip mit

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

Die contains-Methode wird nicht über die gesamte Enumeration iterieren. Die contains-Methode wird in beiden EnumSet-Implementierungen, JumboEnumSet und RegularEnumSet, überschrieben. –

+1

@DLevant, danke, korrigierte ich – Andrew