簡體   English   中英

什么時候Scala中的一套比另一套少?

[英]When is one Set less than another in Scala?

我想比較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

這不適用於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM