2016-07-14 20 views
5

Mam EnumSet i chcę konwertować iz powrotem do/z tablicy operacyjnej prymitywów logicznych. Jeśli działa lepiej, mógłbym pracować z obiektami List zamiast tablicowymi i/lub Boolean, a nie obiektami logicznymi.Konwertuj między EnumSet i tablicą wartości logicznych

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

Co chcę dostać się na drugim końcu jest tablica, która wygląda tak:

[TRUE, TRUE, FALSE] 

To Pytanie o to podobne do tego, Convert an EnumSet to an array of integers. Różnice:

  • boolean lub Boolean versus całkowite (oczywiście)
  • chcę wszyscy członkowie wyliczenia mają być reprezentowane, z TRUE za każdy element wyliczenia zawarte w EnumSet i FALSE dla każdego elementu, który jest wykluczony od EnumSet. Druga tablica pytań zawiera tylko elementy znalezione w EnumSet. (Co ważniejsze)

Odpowiedz

6

Aby to zrobić, że chcesz po prostu napisać

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

Idąc w drugą stronę, z logicznej tablicy present utworzonego powyżej enumSet_ utworzonej poniżej.

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

Dzięki. Ciekawi mnie rozbudowana składnia lambda/strumieni, ale dobrze jest pokazać prostą, ale pewną staroświecką składnię. –

+0

Pozwoliłem sobie napisać przykładowy kod do przechodzenia w innym kierunku, od tablicy do EnumSet. Ten kod jest oparty na pewnym działającym kodzie, ale został zmodyfikowany, by pasował do twojego przykładu tutaj. Więc nie jestem w 100%, jeśli mój kod zamieszczony tutaj jest poprawny. –

+0

@BasilBourque, co to jest 'QuarterHour'? – Andrew

2

W Javie 8 można zrobić to jak to

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

Aby przejść na odwrót można zrobić coś takiego

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

Na razie nie mam zobacz lepsze rozwiązanie niż

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

Do uzyskać EnumSet z tablicy boolean prymitywów za pomocą zip

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

Metoda contains nie spowoduje iteracji całego wyliczenia. Metoda contains jest nadpisywana w obu implementacjach EnumSet, JumboEnumSet i RegularEnumSet. –

+1

@DLevant, dziękuję, poprawiłem – Andrew