Scala中的可变排序集不起作用我希望(也许我错过了一些东西)

时间:2015-09-07 12:08:54

标签: 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)。 我错过了什么?

2 个答案:

答案 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中。