检查enumsets是否具有相同的枚举值

gts*_*s13 7 java collections enums enumset

我有两个EnumSet.

EnumSet.of(A1, A2, A3);
EnumSet.of(A3, A4, A5, A6);
Run Code Online (Sandbox Code Playgroud)

我想找到两个集合中存在哪些值.(在这种情况下,A3.)

有没有快速的方法呢?

Swa*_*nil 9

EnumSet是一套.所以你可以使用retainAll方法来获得交集.

仅保留此集合中包含在指定集合中的元素(可选操作).换句话说,从此集合中删除未包含在指定集合中的所有元素.如果指定的集合也是一个集合,则此操作会有效地修改此集合,使其值为两个集合的交集.

请注意,这将修改现有集合.如果您不想要,可以创建副本.如果这不适合您,您可以寻找其他解决方案.

  • 如果仔细查看该方法,它会*修改*set和布尔返回值,只是告诉您在此方法调用后是否更改了set. (4认同)

F. *_*ler 7

由于EnumSets是子类型Iterable,您可以使用CollectionUtilsApaches Collections(通常使用的第三方库).

CollectionUtils.intersection (
    EnumSet.of (A1, A2, A3), 
    EnumSet.of (A3, A4, A5, A6)
);
Run Code Online (Sandbox Code Playgroud)

  • 考虑到使用现有Java SE类可以轻松解决问题,这个问题不是添加第三方库依赖的好理由. (6认同)

小智 7

EnumSet A = EnumSet.of(A1, A2, A3);
EnumSet B = EnumSet.of(A3, A4, A5, A6);

EnumSet intersection = EnumSet.copyOf(A);

intersection.retainAll(B);
Run Code Online (Sandbox Code Playgroud)

retainAll 修改基础集,以便创建副本.


fab*_*ian 6

您可以在java 8中使用Streams API:

Set set1 = EnumSet.of(A1, A2, A3); // add type argument to set
Set set2 = EnumSet.of(A3, A4, A5, A6); // add type argument to set
set2.stream().filter(set1::contains).forEach(a -> {
    // Do something with a (it's in both sets)
});
Run Code Online (Sandbox Code Playgroud)