4

我想在 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
4

3 回答 3

5

这不适用于 2.8。在 Scala 2.7 上,会发生以下情况:

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

换句话说,在 上定义了一个隐式转换scala.Predef,对于所有 Scala 代码,从 anIterable[A]到 an都是“导入”的Ordered[Iterable[A]],前提是有一个隐式A => Ordered[A]可用。

鉴于集合的可迭代顺序是未定义的,您无法真正预测它。例如,如果您添加元素以使集合大小大于四个,您将获得完全不同的结果。

于 2010-07-01T21:42:04.910 回答
2

如果要比较基数,直接这样做:

scala> Set(1, 2, 3).size < Set(2, 3, 4, 5).size
res0: Boolean = true
于 2010-07-01T19:41:18.653 回答
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) <
            ^

这告诉我<来自 trait 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

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

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

于 2010-07-01T20:04:36.850 回答