arrays - elementos - como declarar un array en kotlin
Método igual para la clase de datos en kotlin (2)
En data
verificación de igualdad de las clases de data
Kotlin, las matrices, al igual que otras clases, se comparan utilizando equals(...)
, que compara las referencias de las matrices, no el contenido. Este comportamiento se describe here :
Entonces, cada vez que digas
arr1 == arr2
DataClass(arr1) == DataClass(arr2)
- ...
se obtienen las matrices comparadas a través de
equals()
, es decir, referencialmente.
Dado que,
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
Para anular esto y hacer que las matrices se comparen estructuralmente, puede implementar equals(...)
+ hashCode()
en su clase de datos usando Arrays.equals(...)
y 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)
}
Este código es lo que IntelliJ IDEA puede generar automáticamente para las clases que no son de datos.
Otra solución es usar List<Int>
lugar de IntArray
. Las listas se comparan estructuralmente, por lo que no tendrá que anular nada.
Tengo la siguiente clase de datos
data class PuzzleBoard(val board: IntArray) {
val dimension by lazy { Math.sqrt(board.size.toDouble()).toInt() }
}
Leí que las clases de datos en Kotlin obtienen el método equals () / hashcode () de forma gratuita.
He instanciado dos objetos.
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))
Pero aún así las siguientes afirmaciones devuelven falsas.
board1 == board2
board1.equals(board2)
Para las clases de datos en Kotlin, el método hashcode () generará y devolverá el mismo entero si los valores de los parámetros son los mismos para ambos objetos.
val user = User("Alex", 1)
val secondUser = User("Alex", 1)
val thirdUser = User("Max", 2)
println(user.hashCode().equals(secondUser.hashCode()))
println(user.hashCode().equals(thirdUser.hashCode()))
La ejecución de este código devolverá Verdadero y Falso como cuando creamos el objeto SecondUser , hemos pasado el mismo argumento que el usuario del objeto, por lo que el entero hashCode () generado para ambos será el mismo.
también si va a comprobar esto:
println(user.equals(thirdUser))
Se devolverá falso.
Según el método hashCode () docs
open fun hashCode(): Int (source)
Devuelve un valor de código hash para el objeto. El contrato general de hashCode es:
Cada vez que se invoca en el mismo objeto más de una vez, el método hashCode debe devolver sistemáticamente el mismo número entero, siempre que no se modifique la información utilizada en comparaciones iguales en el objeto.
Si dos objetos son iguales de acuerdo con el método equals (), la invocación del método hashCode en cada uno de los dos objetos debe producir el mismo resultado entero.
Para más detalles vea esta discusión here