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

时间:2015-02-24 20:38:03

标签: java scala set contains

在将一些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

4 个答案:

答案 0 :(得分:25)

subsetOf,用于测试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

答案 1 :(得分:7)

在Scala中,Set配备了intersect等集合操作,例如

set.intersect(subset) == subset

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

答案 2 :(得分:4)

值得补充的是,如果需要,可以通过使用隐式的富集类,在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)
}

那么你可以这样做:

Set(1, 2, 3).containsAll(Set(1, 2))

或者:

Set(1, 2, 3).containsAll(1, 2)

答案 3 :(得分:0)

以前的答案都很好,我只是提出了另一个选择。此方法也可以与没有List方法的subsetOf s一起使用:

Set(1,2,3) forall(Set(3, 2, 1) contains)