Java: ¿Cómo probar la igualdad de matrices?

¿Por qué se imprime el siguiente código? "Different."?

boolean[][] a = { {false,true}, {true,false} };
boolean[][] b = { {false,true}, {true,false} };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");

preguntado el 08 de noviembre de 11 a las 13:11

Yo siempre probaría a == b primero o nada. Si equals es verdadera, la segunda expresión siempre debe ser verdadera. -

La implementación estándar comienza con esa verificación de todos modos, por lo que personalmente la dejaría fuera. -

Solo debe indicar que ambos dan falso. -

@PeterLawrey en realidad, quieres decir que si == es verdadero, entonces igual debería ser verdadero. -

4 Respuestas

¿Por qué se imprime el siguiente código? "Different."?

Porque Arrays.equals realiza un superficial comparación. Dado que las matrices heredan su equals-método de Object, se realizará una comparación de identidad para las matrices internas, que fallarán, ya que a y b no se refiera a la mismo matrices

Si cambia a Arrays.deepEquals se imprimirá "Equal." como se esperaba.

Respondido el 07 de junio de 15 a las 09:06

La documentación dice a Array.equals: "Devuelve verdadero si las dos matrices de objetos especificadas son iguales entre sí. Las dos matrices se consideran iguales si ambas matrices contienen el mismo número de elementos, y todos los pares de elementos correspondientes en las dos matrices son iguales. igual." Entonces, ¿eso no significa una comparación completa ...? - user905686

No, porque los elementos de a y b no equals(...) mutuamente. Pruébelo usted mismo: a[0].equals(b[0]) y verás que es falso. - aioobe

Sería mejor verificar a == b antes de llamar deepEquals¿no es así? - Victor Sorokin

No, sería mejor dejar esa redundancia por completo. (La implementación estándar de Arrays.equals comience con ese cheque de todos modos.) - aioobe

Tenga en cuenta que Arrays.equals es adecuado para matrices de una sola dimensión: en este ejemplo, Arrays.equals (a [0], b [0]) es verdadero. - Stephen Schaub

Realmente no es obvio.

En primer lugar, la == operador simplemente compare dos punteros. Porque a y b son objetos distintos ubicados en diferentes direcciones de memoria, a == b regresará false (Oigan, puristas de Java, sé que el == realmente comparar identidades de objeto. Solo intento ser didáctico).

Ahora echemos un vistazo al equals() implementación de matrices:

boolean[] c = new boolean[] { false, true, false };
boolean[] d = new boolean[] { false, true, false };

if (c.equals(d)) {
    System.out.println("Equals");
} else {
    System.out.println("Not equals");
}

Eso imprimiría Not equals porque ninguna instancia de matriz realmente implementa el equals() Método. Entonces, cuando llamamos <somearray>.equals(<otherarray>) en realidad estamos llamando al Object.equals() método, que simplemente compara dos punteros.

Dicho esto, observe que su código en realidad está haciendo esto:

boolean[] a0 = new boolean[] { false, true };
boolean[] a1 = new boolean[] { true, false };
boolean[] b0 = new boolean[] { false, true };
boolean[] b1 = new boolean[] { true, false };
boolean[][] a = new boolean[][] { a0, a1 };
boolean[][] b = new boolean[][] { b0, b1 };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");

La Arrays.equals(a, b) eventualmente llamará a0.equals(b0) que volverá false. Por esta razón, Arrays.equals(a, b) regresará false también.

Entonces tu código se imprimirá Different. y llegamos a la conclusión de que la igualdad de Java a veces puede ser complicada.

respondido 08 nov., 11:18

Utilice Arrays.deepEquals () para matrices multidimensionales.

respondido 08 nov., 11:17

jajaja, esta fue la respuesta que estaba buscando durante mucho tiempo - Все Едно

public static boolean equal(double[][] a, double[][] b) {
        if (a == null) {
            return (b == null);
        }
        if (b == null) {
            return false;  // already know 'a' isn't null
        }
        if (a.length != b.length) {
            return false;
        }
        for (int i = 0; i < a.length; i++) {
            if (!Arrays.equals(a[i], b[i])) {
                return false;
            }
        }
        return true;
    }

Respondido 09 Jul 12, 13:07

No es una buena práctica reimplementar Arrays.deepEquals. Las respuestas dadas hasta ahora cubren buenas explicaciones y soluciones. - user905686

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.