首页 > 解决方案 > 为什么我的 Kotlin 可比较而不是正确的相等比较?

问题描述

我目前正在尝试制作一个可比较的对象并使用 compareTo() 函数,为此我编写了以下代码

    class InfoAcad(e: String, m: String, c: Int): Comparable<InfoAcad> {
          override operator fun compareTo(other: InfoAcad): Int {
                if (this.e < other.e) return -1
                if (this.e > other.e) return 1
                if (this.e == other.e && this.m < other.m) return -1
                if (this.e == other.e && this.m > other.m) return 1
                return 0
         }
    }

这个想法是 e 是作为字符串输入的 ID 号,它始终遵循格式 XX-XXX,其中每个 X 字符是 0 到 9 之间的整数,m 是遵循格式 LL-XXX 的课程代码,其中每个 L 字符是 A 和 Z 之间的大写字母,X 字符是 0 到 9 之间的整数,就像 ID 号一样。对象首先通过 ID 号进行比较,如果 ID 号相等,则通过课程代码进行比较,如果两个值相同则对象相等,比较时不考虑 c 参数。我昨天发现我可以直接在 Kotlin 中以 < 和 > 关系比较字符串,所以我决定尝试使用它来让比较 InfoAcad 对象的任务对我自己来说更容易一些,但是当我创建一个 main 函数来测试比较,等式总是返回一个假值,与 InfoAcad 对象的字符串值中的内容无关。这里说主要功能:

    fun main() {
         var A = InfoAcad("18-10125", "CI-2526", 3)
         var B = InfoAcad("18-10125", "CI-2526", 5)
         println("A = B: " + (A == B).toString()) //true
         println("A < B: " + (A < B).toString())  //false  
         ptintln("A > B: " + (A > B).toString())  //false
   }

当我更改 ID 和课程代码值中的字符时,不等式关系按预期工作,那么什么可能导致等式关系始终返回 false?我提前感谢并感谢任何回复。

注意:我也试过给 A 和 B 相同的 c 值,相等部分仍然返回 false。

标签: kotlinobject

解决方案


也覆盖该equals函数,或使用data class.

compareTo仅用于<and>运算符。==运算符由单独的函数equals实现。

您可以在 Kotlin 文档的运算符重载部分中找到可用的运算符以及需要为每个运算符覆盖的函数。

如果您不覆盖该equals函数,则默认行为是它使用对象标识。这意味着两个不同的对象,即使它们包含相同的字段,也永远不会被视为相等。

但是,您想要做的事情有一个很好的捷径!equals如果您将类设为数据类, Kotlin 会自动为您生成一个函数。它非常适合像您这样的课程,其主要目的是保存数据。


推荐阅读