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

时间:2010-07-01 19:10:33

标签: scala scala-collections

我想比较Scala中两组的基数。由于Scala中的某些东西有时“正常工作”,我尝试在集合之间使用<。它似乎经历了,但我无法理解结果。

示例:

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 个答案:

答案 0 :(得分:5)

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

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

换句话说,在scala.Predef上定义了一个隐式转换,它是针对所有Scala代码“导入”的,从Iterable[A]Ordered[Iterable[A]],只要有隐式{{ 1}}可用。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分: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特性中找到的:在集合之间没有<的实现,而不是比较它们的hashCode:

  

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