在EnumSet和布尔值数组之间进行转换

5

我有一个EnumSet,想要将其转换成布尔基本类型数组并反向转换。如果更好的话,我可以使用List代替数组,并且使用Boolean对象而不是基本布尔类型。

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

我希望得到的结果是一个数组,长这样:
[TRUE, TRUE, FALSE]

这个问题与将EnumSet转换为整数数组类似,但有以下区别:

  • 布尔值或Boolean与整数不同(显然)
  • 我希望枚举的所有成员都被表示出来,对于每个包含在EnumSet中的枚举元素,使用TRUE表示,对于每个从EnumSet中排除的元素,使用FALSE表示。另一个问题的数组仅包括EnumSet中找到的项目。(更重要的是)
3个回答

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

谢谢。我对更高级的 lambda/streams 语法很好奇,但展示简单而可靠的老式语法也是不错的。 - Basil Bourque
我冒昧地编写了示例代码,用于从数组转换为EnumSet。这段代码基于我的一些可行代码,但已修改以匹配您在此处的示例。因此,我不能百分之百确定我在此处发布的代码是否正确。 - Basil Bourque
@BasilBourque,什么是QuarterHour - Andrew Tobilko
@AndrewTobilko 抱歉,QuarterHour是我从我的另一个回答中复制粘贴过来的错误。现在已经修复了。 - Basil Bourque

4

目前来看,我认为没有比以下更好的解决方案:

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

通过使用zipboolean原始数组获取EnumSet

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

1
contains方法不会遍历整个枚举。在JumboEnumSet和RegularEnumSet的两个实现中,contains方法被重写了。 - D Levant

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接