kotlin - 为什么我的 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。
解决方案
也覆盖该equals
函数,或使用data class
.
compareTo
仅用于<
and>
运算符。==
运算符由单独的函数equals
实现。
您可以在 Kotlin 文档的运算符重载部分中找到可用的运算符以及需要为每个运算符覆盖的函数。
如果您不覆盖该equals
函数,则默认行为是它使用对象标识。这意味着两个不同的对象,即使它们包含相同的字段,也永远不会被视为相等。
但是,您想要做的事情有一个很好的捷径!equals
如果您将类设为数据类, Kotlin 会自动为您生成一个函数。它非常适合像您这样的课程,其主要目的是保存数据。
推荐阅读
- dart - Flutter bloc 和 Firebase 电话身份验证
- java - Android Intent.FLAG_ACTIVITY_CLEAR_TOP 清除 SharedPreferences?
- mongodb - 在 $addFields mongo 聚合中添加一个字段,该字段是另一个字段的映射
- scala - 比较两个数据帧得到数字重复
- f# - F#管道函数执行流程
- elasticsearch - Elasticsearch:可以用来避免编写自己的 NLP 吗?(例如重新发明轮子)
- c - 将图像转换为原始位图文件
- rabbitmq - 联合 AMQP 091 和 1.0 队列
- javascript - 如何使用 Angular Animations 或使用 css 在 ng-bootstrap 中制作下拉滑动动画?
- python - 拥有不同版本的无的合理方法?