2015-09-07 59 views
2

比方說,你有以下幾種:可變的有序集合在Scala中不工作我希望(也許我失去了一些東西)

case class Foo(x: Int, y: Int) extends Ordered[Foo] { 
    override def compare(that: Foo): Int = x compareTo that.x 
} 

val mutableSet: scala.collection.mutable.SortedSet[Foo] = 
    scala.collection.mutable.SortedSet(Foo(1, 2), Foo(1,3)) 

我期待的mutableSet.size的結果是2。爲什麼,Foo(1,2)Foo(1,3)是不相等的,但他們有相同的順序。所以排序集應該是(IMO)Foo(1,2), Foo(1,3)。因爲這是他們創建的順序(即使其他方式也沒問題,反直覺但很好)。

然而,mutableSet.size結果是1並將其保存的最後一個值,即Foo(1,3)。 我錯過了什麼?

回答

3

的行爲類似於Java SortedSet的集合。 SortedSet使用compareTo來定義相等性,因此它從您的示例中消除了相同的Foo案例類。

在斯卡拉2.11它使用scala.collection.TreeSet爲實現SortedSet的實現。解決這個問題的最好方法是將斷點放入compareTo方法中。

TreeSet的使用AVL樹的數據結構來實現,你可以通過查看節點類AVLTree.scala插入方法檢查的行爲。它將compareTo結果與0進行比較以便弄清楚它是否在集合中重複了元素。

+0

我希望斯卡拉文件提出了一些細節,如的有序集合確實Java文檔。閱讀有序集合的java文檔很清楚,這是行爲。當我遇到這個問題時,我立即檢查了scala文檔,看看它是否討論了這種行爲。現在很清楚......謝謝:-)。順便說一句,取自java docs「排序集的行爲是很好定義的,即使它的排序與equals不一致;它只是不服從Set接口的總體契約。」所以我想這是有道理的我很困惑;-) – netta

+0

好,斯卡拉文件確實已經說,'compare'必須與'equals'一致的,所以我不知道有多少幫助額外的文檔說同樣的事情會。 – Hugh

2

您已經覆蓋compare所以只有第一場是在比較中使用。該設置使用這個compare函數不僅僅是爲了對項目進行排序,而且還爲了將它們存儲在Set中來確定項目是否相等。

相關問題