首页 文章

什么时候Scala中的Set少于另一个?

提问于
浏览
4

我想比较Scala中两组的基数 . 由于Scala中的东西有时候"just work",我尝试在集合之间使用 < . 它似乎经历了,但我无法理解结果 .

例:

scala> Set(1,2,3) < Set(1,4)
res20: Boolean = true
  • 它返回什么?

  • 我在哪里可以阅读API中的此方法?

  • 为什么不列在 scala.collection.immutable.Set 下的任何地方?


更新:即使集合中元素的顺序(??)似乎也很重要:

scala> Set(2,3,1) < Set(1,3)
res24: Boolean = false

scala> Set(1,2,3) < Set(1,3)
res25: Boolean = true

3 回答

  • 2

    这不适用于2.8 . 在Scala 2.7上,会发生什么:

    scala.Predef.iterable2ordered(Set(1, 2, 3): Iterable[Int]) < (Set(1, 3, 2): Iterable[Int])
    

    换句话说,在 scala.Predef 上定义了隐式转换,对于所有Scala代码都是"imported",从 Iterable[A]Ordered[Iterable[A]] ,前提是有一个隐含的 A => Ordered[A] 可用 .

    鉴于集合的可迭代顺序未定义,您无法真正预测它 . 例如,如果添加元素以使设置大小大于4,则会得到完全不同的结果 .

  • 5

    如果您想比较基数,请直接进行:

    scala> Set(1, 2, 3).size < Set(2, 3, 4, 5).size
    res0: Boolean = true
    
  • 0

    我对Scala的了解不多,但做了一些测试,我得到以下内容:

    scala> Set(1,2) <
    <console>:5: error: missing arguments for method < in trait Ordered;
    follow this method with `_' if you want to treat it as a partially applied function
       Set(1,2) <
                ^
    

    这告诉我 < 来自特质 Ordered . 更多提示:

    scala> Set(1,2) < _
    res4: (Iterable[Int]) => Boolean = <function>
    

    也就是说, Set 被评估为 Iterable ,因为可能存在从Iterable [A]到Ordered [Iterable [A]]的隐式转换,但我不确定...测试不一致 . 例如,这两个可能暗示一种词典比较:

    scala> Set(1,2,3) < Set(1,2,4)
    res5: Boolean = true
    

    1相等,2相等,3小于4 .

    scala> Set(1,2,4) < Set(1,2,3)
    res6: Boolean = false
    

    但这些不是:

    scala> Set(2,1) < Set(2,4)
    res11: Boolean = true
    
    scala> Set(2,1) < Set(2,2)
    res12: Boolean = false
    

    我认为正确的答案是在 Ordered trait中找到的:在集合之间没有比实现它们的hashCode更多的实现了 <

    重要的是,Ordered [A]实例的hashCode方法与compare方法一致 . 但是,不可能提供合理的默认实现 . 因此,如果您需要能够计算Ordered [A]实例的哈希值,则必须在iniririting或instantiating时自行提供 .

相关问题