2013-08-01 4 views
0

J'ai un tableau qui est un octet [] d'un fichier que j'ai lu. J'ai besoin de vérifier les 5 premiers octets du fichier. Pour commencer, je l'ai fait:Java: Arrays.equals ne fonctionne pas

if (ips_bytes[0] != ips_ident[0] && ips_bytes[1] != ips_ident[1] && ips_bytes[2] != ips_ident[2] 
      && ips_bytes[3] != ips_ident[3] && ips_bytes[4] != ips_ident[4]) { 
     return "Nope!"; 
    } 

Cela fonctionne, mais il ne semble pas très agréable et je pense que ce n'est pas très efficace. J'ai donc regardé dans d'autres méthodes et trouvé Arrays.equals(). J'ai changé mon code pour indiquer que:

if (!Arrays.equals(ips_ident, Arrays.copyOfRange(ips_bytes, 0, 4))) { 
     return "Baka"; 
    } 

Cela ne fonctionne pas, et j'ai essayé 0, 4 et 1, 5 pour voir si les plages étaient différentes. Ai-je manqué quelque chose parce que cela semble correct? Les valeurs du tableau sont définitivement correctes.

+1

Peut-être que les tableaux ne sont pas égaux – aaronman

+0

Votre premier exemple évalue seulement à 'true' si every single comparison_ échoue (vous utilisez' '&&). Le second échouera si la comparaison _any_ échoue. La logique n'est même pas proche de similaire. – jahroy

+1

Vous voulez utiliser 'Arrays.copyOfRange (ips_bytes, 0, ips_ident.length)' pour être sûr que vous obtenez une gamme d'éléments correspondants – MadProgrammer

Répondre

6

Vos conditions ne sont pas équivalentes.

premier sera vrai si toutes les paires d'éléments correspondants ne sont pas égaux

Le second sera vrai si existe au moins une paire d'éléments qui ne sont pas égaux

Je crois que vous avez besoin de la deuxième code, mais vous devez le réparer un peu. Arrays.copyOfRange le troisième paramètre-index est exculeded. Vous avez donc besoin

Arrays.copyOfRange(ips_bytes, 0, 5)) 

ou mieux

Arrays.copyOfRange(ips_bytes, 0, ips_ident.length)) 
+0

Si au moins un échoue, cela entraînera un échec? C'est toujours un problème puisque chacun d'entre eux correspond, pourquoi retournerait-il un échec? – Linkandzelda

1

Je suppose que si la même gamme d'octets:

if (!Arrays.equals(Arrays.copyOfRange(ips_ident, 0, 5), Arrays.copyOfRange(ips_bytes, 0, 5))) 

Exemple

char[] arr1 = new char[] { 'a', 'b', 'c', 'd', 'e' }; 
char[] arr2 = new char[] { 'a', 'b', 'c', 'k', 'm' }; 
System.out.println(Arrays.equals(Arrays.copyOfRange(arr1, 0, 3), Arrays.copyOfRange(arr2, 0, 3))); 
+0

Merci, ça l'a fait! – Linkandzelda

1

Voici une approche qui n » t utilise de la mémoire inutile et est réutilisable .

Il suffit d'utiliser une boucle:

public boolean compareFirstBytes(byte[] arrayOne, byte[] arrayTwo, int range) { 
    for (int i = 0; i < range; i++) { 
     if (arrayOne[i] != arrayTwo[i]) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

Pourquoi était-ce downvoted? C'est mieux que de faire deux nouveaux tableaux à mon avis ... – jahroy