类似于'包含任何'的Java设置?

Rah*_*arg 279 java

我有两套相同类型的A和B套装.

我必须找到A是否包含集合B中的任何元素.

没有迭代集合,最好的方法是什么?该组库有contains(object)containsAll(collection),但不会containsAny(collection).

小智 489

不行Collections.disjoint(A, B)吗?从文档:

true如果两个指定的集合没有共同的元素,则返回.

因此,false如果集合包含任何公共元素,则该方法返回.

  • 更喜欢其他解决方案,因为它不会修改任何一个集合或创建一个新集合. (14认同)
  • 并且是标准的JRE,适用于任何集合,而不仅仅是集合. (6认同)
  • 实际上,一旦找到第一个共同元素,它就会短路 (6认同)
  • 我不认为这是最快的,当找到交叉点的第一个元素时它不会短路. (4认同)
  • @Xipo 是对的。检查 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.disjoint%28java.util.Collection%2Cjava.util .集合%29 (3认同)
  • 请小心将“不相交”和“包含任何”等同起来。当“setB”为空时,“setA.containsAll(setB)”返回“true”。因此,“setA.containsAny(setB)”也会返回“true”。然而,`!Collections.disjoint(setA, setB)`返回`false`,因为所有集合都与空集合不相交。 (2认同)

gpl*_*gpl 131

从Java 8开始: Stream::anyMatch

  • @Cristiano在这里,`anyMatch`将流式传输`setA`中的所有元素,并在所有元素上调用`setB.contains()`.如果为任何元素返回"true",则表达式将评估为true.希望这有帮助. (6认同)
  • 这正是我一直在寻找的!谢谢:-) 我也不知道你可以使用 :: 语法的变量! (3认同)
  • anyMatch 的效率与 Collections.disjoint 的效率相同。 (3认同)
  • @Cristiano https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#anyMatch-java.util.function.Predicate- (2认同)
  • 这可行,但如果“setA”很大,效率就会很低。正确的答案是调用“Collections.disjoint”。 (2认同)

CaT*_*t.X 30

实现containsAny for sets的一种好方法是使用Guava Sets.intersection().

containsAny会返回一个boolean,所以调用看起来像:

Sets.intersection(set1, set2).isEmpty()
Run Code Online (Sandbox Code Playgroud)

如果集合是不相交的,则返回true,否则返回false.这个时间复杂度可能比retainAll略好,因为您不必进行任何克隆以避免修改原始集.

  • 使用此方法的唯一缺点是您必须包含番石榴库.我认为这不是缺点,因为谷歌收集API非常强大. (2认同)
  • @MohammadAdnan 这不是唯一的缺点。在“containsAny”逻辑中,如果不是必须的话,您应该在找到匹配项后立即返回,但此方法将运行直到两个集合中都达到“数据结束”为止 (2认同)

Yam*_*cha 24

Apache Commons有一个方法CollectionUtils.containsAny().


Ada*_*11p 12

我使用 org.apache.commons.collections.CollectionUtils

CollectionUtils.containsAny(someCollection1, someCollection2)
Run Code Online (Sandbox Code Playgroud)

就这些!如果两个集合中至少有一个元素,则 返回true.

使用简单,功能名称更具启发性.


Sur*_*mar 5

使用retainAll()在设置界面.该方法提供了两组中共同的元素的交集.有关更多信息,请参阅API文档.

  • 伊沙维特是正确的。鉴于OP正在查看两个集合中是否存在**任何**元素,正确的算法在最好的情况下将具有“O(1)”运行时间,而“retainAll”将具有类似的内容“O(N)”(这仅取决于 1 组的大小)最佳情况运行时间。 (2认同)