Scala中的可变排序集不';我没法工作(也许我错过了什么)

Scala中的可变排序集不';我没法工作(也许我错过了什么),scala,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)) 我希望m

假设你有以下几点:

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类

在Scala2.11中,它使用
Scala.collection.TreeSet
实现SortedSet。解决这一问题的最佳方法是将断点放入
compareTo
方法中


TreeSet是使用AVL树数据结构实现的,您可以通过查看节点类的insert方法来检查行为。它将
compare to
结果与0进行比较,以确定它是否与集合中的元素重复。

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

我希望scala文档能够像排序集合的java文档那样提供一些细节。阅读排序集的java文档,很明显这就是行为。当我遇到这个问题时,我立即检查了scala文档,看看它是否谈到了这种行为。现在一切都清楚了…谢谢:-)。顺便说一句,摘自java文档“排序集的行为是定义良好的,即使其顺序与equals不一致;它只是不遵守集合接口的一般约定。”因此我想这是有道理的,我感到困惑;-)好吧,Scala文档已经说过,
compare
必须与
equals
一致,所以我不确定说同样事情的额外文档会有多大帮助。