假设您有以下内容:
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)
。
我错过了什么?
答案 0 :(得分:3)
该行为类似于Java SortedSet集合。 SortedSet
使用compareTo来定义相等性,因此它从您的示例中删除了相同的Foo案例类。
在Scala 2.11中,它使用scala.collection.TreeSet
来实现SortedSet实现。找出这个问题的最好方法是将断点放入compareTo
方法。
TreeSet是使用AVL Tree数据结构实现的,您可以通过查看Node类的AVLTree.scala insert方法来检查行为。它将compareTo
结果与0进行比较,以便弄清楚它是否在集合中重复了元素。
答案 1 :(得分:2)
您已覆盖compare
,因此仅比较第一个字段。集合使用此compare
函数不仅可以对项目进行排序,还可以确定项目是否相同,以便将它们存储在Set
中。