matriz elementos definir declarar como arreglos arreglo array agregar arrays equals kotlin data-class

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