我期望 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 SortedSet集合。SortedSet使用compareTo来定义相等性,因此它从您的示例中消除了相同的Foo case类。

在Scala 2.11中,它使用scala.collection.TreeSet实现SortedSet的实现。解决这个问题的最好方法是在compareTo方法中加入断点。

TreeSet是使用AVL树数据结构实现的,您可以通过查看AVL树来检查行为。Node类的scala插入方法。它比较compareTo的结果与0,以确定它是否复制了集合中的元素。

您已经覆盖了compare,因此在比较中只使用第一个字段。Set使用这个compare函数不仅对项目进行排序,而且还确定项目是否相等,以便将它们存储在Set中。

相关内容

最新更新