2010-07-01 65 views
4

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

回答

5

這不適用於2.8。在斯卡拉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,則會得到完全不同的結果。

+0

+1。我只是好奇......在斯卡拉2.8這是不允許的,因爲集合的迭代次序是不確定的? – 2010-07-01 23:32:57

+0

@Diego我認爲它被拋棄了,因爲收集的順序被認爲是特定於應用程序的。 – 2010-07-02 05:54:53

1

如果要比較的基數,只是這樣做的直接:

scala> Set(1, 2, 3).size < Set(2, 3, 4, 5).size 
res0: Boolean = true 
+0

當然。儘管如此,這並沒有回答任何問題。 – aioobe 2010-07-01 19:49:18

0

我的斯卡拉的知識並不豐富,但做了一些測試,我得到以下幾點:

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,因爲也許有來自可迭代[A]到有序[可迭代[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]的實例的散列值,則必須在inheiriting或instantiating時自己提供它。

+0

爲什麼Set會繼承Ordered特性? – aioobe 2010-07-01 20:09:36

+0

對Scala本人一無所知,我也很驚訝地發現你認爲這是有道理的。數學意義上的'集合'沒有秩序。 – pkaeding 2010-07-01 20:15:07

+0

糟糕,你們兩個都對。感謝您指出!我將編輯帖子。我認爲正確的推理是通過(也許)一些隱式轉換爲「易爆」定義「<」,但它是正確的,我現在完全失去了:) – 2010-07-01 23:08:11

相關問題