[英]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.