5

我有一个EnumSet并且想要在布尔基元数组之间来回转换。如果它工作得更好,我可以使用 aList而不是数组,和/或Boolean对象而不是布尔原语。

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每个枚举元素都包含在 中,每个元素EnumSetFALSE包含在EnumSet. 另一个问题的数组仅包含在EnumSet. (更重要的是)
4

3 回答 3

6

To do that you'd basically write

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

Going the other direction, from boolean array present created above to enumSet_ created below.

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 ] );
    }
}
于 2016-07-14T06:01:29.027 回答
4

目前,我没有看到比这更好的解决方案

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

通过使用从基元EnumSet数组中获取一个booleanzip

MyEnum[] enums = zip(Arrays.stream(MyEnum.values()), Arrays.stream(b),
    (e, b) -> b ? e : null).filter(Objects::nonNull).toArray(MyEnum[]::new);
于 2016-07-14T06:09:45.437 回答
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)));
于 2016-07-14T06:09:16.240 回答