我想比较Scala中两组的基数。由于Scala中的某些东西有时“正常工作”,我尝试在集合之间使用<
。它似乎经历了,但我无法理解结果。
示例:
scala> Set(1,2,3) < Set(1,4)
res20: Boolean = true
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
答案 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]实例的哈希值,则必须在启用或实例化时自行提供。