我有以下数据类
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 +