比方說,你有以下幾種:可變的有序集合在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)
。 我錯過了什麼?
我希望斯卡拉文件提出了一些細節,如的有序集合確實Java文檔。閱讀有序集合的java文檔很清楚,這是行爲。當我遇到這個問題時,我立即檢查了scala文檔,看看它是否討論了這種行爲。現在很清楚......謝謝:-)。順便說一句,取自java docs「排序集的行爲是很好定義的,即使它的排序與equals不一致;它只是不服從Set接口的總體契約。」所以我想這是有道理的我很困惑;-) – netta
好,斯卡拉文件確實已經說,'compare'必須與'equals'一致的,所以我不知道有多少幫助額外的文檔說同樣的事情會。 – Hugh