gpt4 book ai didi

scala 树集排序导致元素消失?

转载 作者:行者123 更新时间:2023-12-01 13:55:07 28 4
gpt4 key购买 nike

有人可以帮助我理解以下内容吗?如果我创建一个元素 TreeMap ,scala 似乎决定我的比较方法也确定元素的相等性,因此根据“比较”方法删除相同的元素。我没想到会这样,因为如果我没有覆盖它,仍然应该根据对象相等性来定义相等性?

import scala.collection.mutable._

class A(val num: Int) extends Ordered[A] {
def compare (that: A) = {
this.num - that.num
}
override def toString() = {
num+""
}
}

object A {
def main(args: Array[String]) = {

val mySet = new TreeSet[A]()
mySet += new A(3)
mySet += new A(2)
mySet += new A(1)
mySet += new A(3)
mySet += new A(2)
mySet += new A(1)

mySet.foreach(println)
}
}

给予

1
2
3

不是我所期望的

1
1
2
2
3
3

最佳答案

您的直觉假设是可以理解的,但一般来说,TreeSet 实现通常依赖于比较方法而不是相等,因为compare 操作返回0 仅当两个对象相等时;对于 Scala,它在 doc 中这样说(比较 方法)。

在 Java 的 TreeSet 中,这是偶数 mentioned explicitly .

在 Scala 中,这在文档中并不明显,但如果您查看 source code ,您会看到 Scala TreeSet 在内部依赖于 RedBlackTree 实现,in its lookup method , 使用 compare 的结果专门测试相等性。

由于 Ordering.compare 的约定,这是完全有效的,如第一段所述 - 即,如果您得到 0,则两个对象相等定义。

关于scala 树集排序导致元素消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19862002/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com