假设您有以下内容:
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 SortedSet集合。SortedSet
使用compareTo来定义相等性,因此它从您的示例中消除了相同的Foo case类。
在Scala 2.11中,它使用scala.collection.TreeSet
实现SortedSet的实现。解决这个问题的最好方法是在compareTo
方法中加入断点。
TreeSet是使用AVL树数据结构实现的,您可以通过查看AVL树来检查行为。Node类的scala插入方法。它比较compareTo
的结果与0,以确定它是否复制了集合中的元素。
您已经覆盖了compare
,因此在比较中只使用第一个字段。Set使用这个compare
函数不仅对项目进行排序,而且还确定项目是否相等,以便将它们存储在Set
中。