【问题标题】:scala treeset ordering causes elements to disappear?scala树集排序导致元素消失?
【发布时间】:2013-11-08 23:13:42
【问题描述】:

有人可以帮我理解以下内容吗?如果我创建元素的树形图,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

【问题讨论】:

    标签: scala


    【解决方案1】:

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

    在 Java 的 TreeSet 中,这甚至是 mentioned explicitly

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

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

    【讨论】:

    • 哇,感谢您提供非常完整且非常快速的答复!感谢您的帮助!
    【解决方案2】:

    来自文档:

    " 重要的是,Ordered[A] 实例的 equals 方法与 compare 方法保持一致。但是,由于类型擦除语义固有的限制,没有合理的方法来提供相等的默认实现对于 Ordered[A] 的实例”

    因此,您应该提供自己的哈希码和 equals 方法。

    【讨论】:

      【解决方案3】:

      据我所知,SortedSet 不允许重复,因此在您的代码中,树的最后插入被忽略

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-08
        • 2020-12-08
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        相关资源
        最近更新 更多