【问题标题】:With Scala's Set, is there a method analog to the containsAll method in Java's Set?使用 Scala 的 Set,是否有类似于 Java 的 Set 中 containsAll 方法的方法?
【发布时间】:2015-04-26 15:58:11
【问题描述】:

在将一些 Java 代码转换为 Scala 时,我发现虽然 Scala 的 Setcontains 方法,但没有 containsAll 方法。我只是缺少正确的方法名称吗?

这是我编写的一些代码来填补空白,以便我可以快速恢复工作。是否足够,还是我遗漏了一些微妙之处?

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

【问题讨论】:

    标签: java scala set contains


    【解决方案1】:

    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
    

    【讨论】:

    • 啊。很不错。这有点违反直觉,因为它是从 Java 反转过来的。但它确实可以满足我的需要。 Tysvm 为您提供快速响应。
    【解决方案2】:

    以前的答案都很好,我只是在添加另一个选项。这也适用于没有subsetOf 方法的Lists:

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

    【讨论】:

      【解决方案3】:

      值得补充的是,如果需要,您可以通过使用隐式丰富类在 Set[T] 上提供类似 containsAll 的派生辅助方法。你也可以考虑做一个可变参数重载:

      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)
      

      【讨论】:

      • 做得很好!我一定会把它添加到我的图书馆中。
      • 明确使用“扩展 AnyVal”而不是隐含的原因是什么?
      • 效率更高。来自文档:“......可以定义 AnyVal 的一个子类,称为用户定义的值类,编译器会对其进行特殊处理。正确定义的用户值类提供了一种通过以下方式提高用户定义类型性能的方法避免在运行时分配对象,并通过用静态方法调用替换虚拟方法调用。”在此处阅读有关AnyVal 和用户定义值类的更多信息:scala-lang.org/api/2.11.4/index.html#scala.AnyVal
      【解决方案4】:

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

      set.intersect(subset) == subset
      

      传达containsAll 的语义,即使是前面提到的subsetOf 也是最简洁的。

      【讨论】:

      • 在非常大的集合(想象数百万个条目)上,这不是大大降低了性能吗? IOW,现在有两个操作,执行交集,然后执行等价检查。似乎单次通过第一组测试第二组中的元素会更可取且性能更高。
      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多