【问题标题】:How to check if collection contains any element from other collection in Scala?如何检查集合是否包含Scala中其他集合的任何元素?
【发布时间】:2016-10-19 16:58:59
【问题描述】:

标题说明了一切,找出集合是否包含其他集合的任何元素的最佳做法是什么?

在java中我会这样执行

CollectionUtils.containsAny(a, b)

使用常见的 apache 集合工具,其中变量 a/b 是集合。

如何在 scala 中实现这种行为?或者上面有没有像 CollectionUtils 这样的库?

我不想使用 common-apache 库,因为我必须将 scala 集合转换为 java 集合。

【问题讨论】:

  • scala 集合和 java 集合有区别吗?
  • @RobertMoskal 是的 - 实际上 scala 有两个完全独立的集合层次结构:不可变和可变。

标签: java scala collections apache-commons


【解决方案1】:

您可以使用exists(p: T => Boolean):Booleancontains(elem: A1):Boolean 的组合:

val a = List(1,2,3,4,5,6,7)
val b = List(11,22,33,44,55,6)

a.exists(b.contains) // true

【讨论】:

  • 这是有道理的......但我认为它不会提高可读性?
【解决方案2】:

相交

val a = Seq(1,2,3) ; val b = Seq(2,4,5)
a.intersect(b)
res0: Seq[Int] = List(2)

// to include the test:
a.intersect(b).nonEmpty  // credit @Lukasz

【讨论】:

  • 不知道为什么它被否决了。这是显而易见的答案
  • 它可以看起来像a.intersect(b).nonEmpty 一样干净。
  • 显而易见的答案是另一个,@TheArchetypalPaul。无论如何,我没有投反对票,只是没有投票。
  • 由于问题实际上是“两个数组是否有任何共同的元素”,我仍然觉得与明显的答案相交。它当然不需要反对票。 Imo 显然
  • 仅仅为了检查它是否为nonEmpty就必须创建一个交集不是很浪费吗?我认为这就是人们投票支持其他解决方案的原因。
【解决方案3】:

使用标准Java Collections 中的disjoint() 实用程序可以确定两个集合是否包含任何公共成员。如果集合不是不相交的,那么它们至少包含一个公共元素。

在内部,Collections.disjoint() 检查任一集合是否为 Set 并进行相应优化。

import collection.JavaConverters._

val a = List(1,2,3,4,5,6,7)
val b = List(11,22,33,44,55,6)

!java.util.Collections.disjoint(a.asJava, b.asJava)  // true

尽管这仍在将 Scala 集合转换为 Java 集合。从好的方面来说,不需要额外的 apache commons 库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-31
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多