使用Scala的Set,是否有类似于Java Set的containsAll方法的方法?

cha*_*ium 17 java scala contains set

在将一些Java代码转换为Scala的过程中,我发现虽然Scala有一种contains方法Set,但是没有一种containsAll方法.我只是错过了正确的方法名称吗?

这是我编写的一些代码,以填补空白,以便我可以快速恢复工作.这还不够,还是我错过了一些微妙之处?

  def containsAll[A](set: Set[A], subset: Set[A]): Boolean =
    if (set.size >= subset.size)
      subset.forall(a => set.contains(a))
    else
      false
Run Code Online (Sandbox Code Playgroud)

Mic*_*jac 28

subsetOf,它测试a的元素Set是否包含在另一个元素中Set.(表达方式相反)

val set = Set(1,2,3,4)
val subset = Set(1,2)

scala> subset.subsetOf(set)
res0: Boolean = true

scala> set.subsetOf(subset)
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)

  • 啊。很不错。它有点违反直觉,因为它与 Java 相反。但它确实满足了我的需要。Tysvm 为您提供快速响应。 (3认同)

elm*_*elm 8

在Scala中,Set配备了一套操作,例如intersect,因此例如

set.intersect(subset) == subset
Run Code Online (Sandbox Code Playgroud)

传达语义containsAll,即使subsetOf已经提到的证明最简洁.


Ben*_*ich 6

值得补充的是,通过使用隐式丰富的类,可以使派生的辅助方法(如需要)containsAll可用Set[T]。您还可以考虑进行可变参数重载:

implicit class RichSet[T](val x: Set[T]) extends AnyVal {
    def containsAll(y: Set[T]): Boolean = y.subsetOf(x)
    def containsAll(y: T*): Boolean = x.containsAll(y.toSet)
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以执行以下操作:

Set(1, 2, 3).containsAll(Set(1, 2))
Run Code Online (Sandbox Code Playgroud)

要么:

Set(1, 2, 3).containsAll(1, 2)
Run Code Online (Sandbox Code Playgroud)

  • 效率更高。从文档中:“ ...可以定义AnyVal的子类,称为用户定义的值类,编译器会对其进行特殊处理。正确定义的用户值类提供了一种方法,可以通过以下方法提高用户定义的类型的性能:避免在运行时分配对象,并通过用静态方法调用替换虚拟方法调用。” 在此处阅读有关`AnyVal`和用户定义的值类的更多信息:http://www.scala-lang.org/api/2.11.4/index.html#scala.AnyVal (3认同)