2016-07-14 101 views
5

Ho un EnumSet e voglio convertire avanti e indietro da/verso una matrice di primitivi booleani. Se funziona meglio, potrei lavorare con un List invece di un array e/o con gli oggetti Boolean piuttosto che con i primitivi booleani.Conversione tra EnumSet e array di valori booleani

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

Quello che voglio ottenere su l'altra estremità è un array che assomiglia a questo:

[TRUE, TRUE, FALSE] 

Questa questione è simile a questo, Convert an EnumSet to an array of integers. Differenze:

  • booleane o Boolean rispetto a numeri interi (ovviamente)
  • voglio tutti i membri della enum di essere rappresentati, con un TRUE per ogni elemento enum incluso nel EnumSet e un FALSE per ogni elemento che viene esclusa dal EnumSet. L'array di altre domande include solo gli elementi trovati nello EnumSet. (Cosa più importante)

risposta

6

Per fare che si sarebbe fondamentalmente scrive

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

Andando nella direzione opposta, dalla matrice booleana present creato in precedenza per enumSet_ creato sotto.

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

Grazie. Ero curioso della sintassi fanatica lambda/streams ma è bello mostrare la sintassi vecchio stile, ma sicura. –

+0

Mi sono preso la libertà di scrivere codice di esempio per andare nella direzione opposta, da array a EnumSet. Questo codice è basato su un mio codice di lavoro, ma modificato per corrispondere al tuo esempio qui. Quindi non sono al 100% se il mio codice pubblicato qui è corretto. –

+0

@BasilBourque, che cos'è "QuarterHour"? – Andrew

2

In Java 8 si poteva fare in questo modo

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

Per andare il contrario si potrebbe fare qualcosa di simile

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

Per il momento, non lo faccio vedere una soluzione migliore di

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

A ottenere un EnumSet da una matrice di boolean primitive utilizzando zip

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

Il metodo contains non esegue iterazioni sull'intero enum. Il metodo contiene è sovrascritto in entrambe le implementazioni EnumSet, JumboEnumSet e RegularEnumSet. –

+1

@Devante, grazie, ho corretto – Andrew