2016-07-14 7 views
5

У меня есть EnumSet и вы хотите преобразовать back-and-forth в/из массива булевых примитивов. Если он работает лучше, я мог бы работать с List вместо массива и/или Boolean объектов, а не булевых примитивов.Преобразование между EnumSet и массивом логических значений

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

То, что я хочу, чтобы на другом конце является массив, который выглядит следующим образом:

[TRUE, TRUE, FALSE] 

Этот вопрос здесь похож на этот, Convert an EnumSet to an array of integers. Отличия:

  • булевых или Boolean против целых чисел (очевидно)
  • Я хочу, чтобы все члены перечисления должны быть представлены с TRUE для каждого перечисления элементов, включенных в EnumSet и FALSE для каждого элемента, который исключается от EnumSet. В массив другого Вопроса входят только элементы, найденные в EnumSet. (Что более важно)

ответ

6

Чтобы сделать это, вы в основном написать

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

Переход в другой стороне, из булева массива present созданных выше enumSet_ созданных ниже.

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

Спасибо. Мне было интересно узнать синтаксис lambda/streams fancier lambda/streams, но хорошо показать простой, но верный старомодный синтаксис. –

+0

Я взял на себя смелость написать пример кода для перехода в другом направлении, от массива до EnumSet. Этот код основан на каком-то рабочем коде, но изменен в соответствии с вашим примером. Поэтому я не на 100%, если мой код, размещенный здесь, является правильным. –

+0

@BasilBourque, что такое 'QuarterHour'? – Andrew

2

В Java 8 вы можете сделать это, как этот

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

Для перехода в другую сторону вокруг вы могли бы сделать что-то вроде этого

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

в настоящее время, я не см. лучшее решение, чем

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

К получить EnumSet из массива boolean примитивов с помощью 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

 Смежные вопросы

  • Нет связанных вопросов^_^