首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EnumSet检查其中之一

使用EnumSet检查其中之一
EN

Stack Overflow用户
提问于 2013-02-26 03:49:11
回答 3查看 3.8K关注 0票数 1

因此,我正在将应用程序中的一些位字段转换为使用EnumSet,我很好奇是否有更好的方法来对X|Y进行比较。目前我们这样做:

代码语言:javascript
复制
if(bitfield & (X | Y) != 0) {
    //do stuff
}

EnumSet的等价物似乎是:

代码语言:javascript
复制
if(enumSet.contains(X) || enumSet.contains(Y)) {
    //do stuff
}

有没有更干净的方法来做这件事?我知道你可以像这样检查containsAll()

代码语言:javascript
复制
EnumSet flagsToCheck = EnumSet.of(X, Y);
if(enumSet.containsAll(flagsToCheck)) {
    //do stuff
}

但这只适用于您想知道是否设置了(X & Y)的场景。有没有等价的方法来检查(X | Y)?我认为会有类似于containsAny()方法的东西,但我没有看到任何似乎具有这种效果的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-26 03:53:11

我想说,现有的方法比您的逐位方法更具可读性。它准确地表达了您的意思:如果集合包含X,或者集合包含Y...让它保持原样。已经很干净了。

如果集合变得更大,您可以使用:

代码语言:javascript
复制
EnumSet<Foo> valid = EnumSet.of(Foo.X, Foo.Y, Foo.A, Foo.B);
valid.retainAll(enumSet);
if (valid.isEmpty()) {
    ...
}

但我只会把它留在更大的案子里。对于两个或三个选项,我会使用手写形式。

票数 7
EN

Stack Overflow用户

发布于 2013-02-26 03:52:32

您可以使用AbstractSet方法removeAll (如果找到任何元素,则为true)。显然,您可能希望使用原始集的克隆来执行此操作。

票数 1
EN

Stack Overflow用户

发布于 2013-11-16 05:29:47

如果您不能更新集合,只需创建一个新的集合...@assylias是对的。这样做的一个选项是只根据您想要的枚举值创建一个新的集合,并相应地进行更改/验证。

代码语言:javascript
复制
public enum ResultingState {
    NOT_PERSISTED, PERSISTED, NOT_CALCULATED, CALCULATED;
}
EnumSet<ResultingState> errorsState = EnumSet.of(ResultingState.NOT_PERSISTED, ResultingState.NOT_CALCULATED);
Collection<ResultingState> results = new HashSet<>(phaseResults.values());
boolean containsAny = results.retainAll(errorsState) && results.size() > 0;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15075203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档