27 votes

Java: comment tester l'égalité des tableaux?

Pourquoi le code suivant imprime-t-il "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.");
 

48voto

aioobe Points 158466

Pourquoi est la suite de l'impression du code - "Different."?

Parce qu' Arrays.equals effectue un peu profonde de comparaison. Comme les tableaux à hériter de leur equals-méthode de Object, une identité, une comparaison sera effectuée à l'intérieur des tableaux, n'ayant pas, depuis a et b ne portent pas sur les mêmes tableaux.

Si vous modifiez Arrays.deepEquals il permet d'imprimer "Equal." comme prévu.

IDEONE.com démo

8voto

fernacolo Points 1626

C'est vraiment pas évident.

Tout d'abord, l' == opérateur, il suffit de comparer deux pointeurs. Parce qu' a et b sont des objets distincts situés à différentes adresses de la mémoire, a == b sera de retour false (Hey, Java les puristes, je sais que l' == comparer réellement les identités de l'objet. Je suis juste essayer d'être didactique).

Maintenant, nous allons jeter un oeil à l' equals() de la mise en œuvre de tableaux:

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");
}

Ce serait imprimer Not equals car aucune occurrence de array en fait met en œuvre l' equals() méthode. Donc, quand nous appelons <somearray>.equals(<otherarray>) nous sommes fait appel de la Object.equals() de la méthode, il suffit de comparer deux pointeurs.

Cela dit, notez que votre code est en train de faire ceci:

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.");

L' Arrays.equals(a, b) finira par appel d' a0.equals(b0) qui sera de retour false. Pour cette raison, Arrays.equals(a, b) sera de retour false ainsi.

Ainsi, votre code sera imprimée Different. et nous concluons que Java égalité peut être difficile parfois.

3voto

MOleYArd Points 684

Utilisez Arrays.deepEquals () pour les tableaux multidimensionnels.

0voto

Ashok D Points 739
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;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X