arrays - Kotlin中数据类的equals方法

我有以下数据类

data class PuzzleBoard(val board: IntArray) {
    val dimension by lazy { Math.sqrt(board.size.toDouble()).toInt() }
}

我读到 Kotlin 中的数据类免费获得 equals()/hashcode() 方法。

我实例化了两个对象。

val board1 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0))
val board2 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0))

但是,以下语句仍然返回 false。

board1 == board2
board1.equals(board2)

最佳答案

在 Kotlin 中 data类相等检查,数组,就像其他类一样,使用 equals(...) 进行比较,它比较数组引用,而不是内容。描述了此行为 here :

So, whenever you say

  • arr1 == arr2

  • DataClass(arr1) == DataClass(arr2)

  • ...

you get the arrays compared through equals(), i.e. referentially.

鉴于此,

val arr1 = intArrayOf(1, 2, 3)
val arr2 = intArrayOf(1, 2, 3)

println(arr1 == arr2) // false is expected here
println(PuzzleBoard(arr1) == PuzzleBoard(arr2)) // false too


要覆盖它并在结构上比较数组,您可以实现 equals(...) + hashCode()在您的数据类中使用 Arrays.equals(...)Arrays.hashCode(...) :

override fun equals(other: Any?): Boolean{
    if (this === other) return true
    if (other?.javaClass != javaClass) return false

    other as PuzzleBoard

    if (!Arrays.equals(board, other.board)) return false

    return true
}

override fun hashCode(): Int{
    return Arrays.hashCode(board)
}

这段代码是 IntelliJ IDEA 可以为非数据类自动生成的。

另一种解决方案是使用 List<Int>而不是 IntArray .列表在结构上进行比较,因此您无需覆盖任何内容。

https://stackoverflow.com/questions/37524422/

相关文章:

kotlin - 实现Java接口(interface)时如何克服 "same JVM signat

android - Kotlin Coroutines 在 Android 中的正确方式

kotlin - 如何在 Kotlin 中向 Java 类添加静态方法

gradle - 如何将 Gradle 项目中 Kotlin 的字节码版本设置为 Java 8?

kotlin - Dagger 和 Kotlin 。 Dagger 不生成组件类

android - IllegalArgumentException : Parameter spe

android - 无法使用 Android Studio 3.0 + DataBinding +

java - Android Studio 3.0 金丝雀 1 : Kotlin tests or

kotlin - Kotlin 中的扩展字段

javascript - Kotlin JavaScript 到 TypeScript 定义文件