我有一个EnumSet
,并希望在布尔基元数组之间来回转换。如果它运行得更好,我可以使用List
而不是数组和/或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
中包含每个枚举元素的EnumSet
,FALSE
中每个元素的EnumSet
代表EnumSet
1}}。另一个问题的数组仅包括city_df.selectExpr( city_df.columns :_* )
中找到的项目。 (更重要的是)答案 0 :(得分: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 ] );
}
}
答案 1 :(得分:4)
目前,我没有看到比
更好的解决方案Boolean[] b = Arrays.stream(MyEnum.values()).map(set::contains).toArray(Boolean[]::new);
使用zip
EnumSet
基元数组中获取boolean
MyEnum[] enums = zip(Arrays.stream(MyEnum.values()), Arrays.stream(b),
(e, b) -> b ? e : null).filter(Objects::nonNull).toArray(MyEnum[]::new);
答案 2 :(得分: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)));