[英]When is one Set less than another in Scala?
我想比较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
这不适用于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]]
,前提是存在一个隐式A => Ordered[A]
可用。
鉴于集合的可迭代顺序是不确定的,因此您实际上无法对其进行太多预测。 例如,如果添加元素以使设置大小大于4,则会得到完全不同的结果。
如果要比较基数,请直接进行以下操作:
scala> Set(1, 2, 3).size < Set(2, 3, 4, 5).size
res0: Boolean = true
我对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]实例的哈希,则必须在初始化或实例化时自行提供哈希。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.