2013-02-15 6 views
21

J'essaie d'écrire du code pour comparer deux tableaux. Dans le premier tableau j'ai mis mes propres chiffres, mais la seconde le tableau prend des nombres du fichier d'entrée. La taille de ce tableau est déterminée par le premier nombre dans le fichier tandis que le premier tableau est toujours de taille 10. La longueur doit être la même pour les deux tableaux ainsi que les nombres. Mon code est ci-dessous:Comparaison de deux tableaux entiers dans Java

public static void compareArrays(int[] array1, int[] array2) { 
    boolean b = false; 
    for (int i = 0; i < array2.length; i++) { 

     for (int a = 0; a < array1.length; a++) { 

      if (array2[i] == array1[a]) { 
       b = true; 
       System.out.println("true"); 
      } else { 
       b = false; 
       System.out.println("False"); 
       break; 
      } 
     } 
    }  
} 
+6

Et quel problème avez-vous? – Rich

+2

@Rich, il semble que OP ne compare pas les tableaux du tout. Il suffit de lire le code –

+0

Quelle est la question? Est-ce que ça ne marche pas? – thegrinner

Répondre

19
public static void compareArrays(int[] array1, int[] array2) { 
     boolean b = true; 
     if (array1 != null && array2 != null){ 
      if (array1.length != array2.length) 
       b = false; 
      else 
       for (int i = 0; i < array2.length; i++) { 
        if (array2[i] != array1[i]) { 
         b = false;  
        }     
      } 
     }else{ 
      b = false; 
     } 
     System.out.println(b); 
    } 
+5

Il est préférable d'imprimer false et de rompre la boucle à la première instance de deux éléments n'étant pas égaux. De même, renvoyer false si la méthode a un type booléen. Il est inutile et inefficace pour itérer 1000 éléments si le premier est différent. Je ferais aussi valoir le retour d'un booléen et l'impression basée sur c'est mieux. De cette façon, la méthode peut être utilisée même lorsque vous voulez vérifier l'égalité en silence. Bien que cette réponse ait pu servir le PO, je pense que la réponse d'exexzian est plus complète. – Reti43

+0

Fonctionne parfaitement, Ce que je m'attendais dans mon code. –

1

Même si il y a quelque chose de facile comme .equals, je voudrais signaler deux erreurs que vous avez faites dans votre code. Le premier: quand vous passez par les tableaux, vous dites b est true ou false. Ensuite, vous recommencez à vérifier, à cause de la boucle for. Mais chaque fois que vous donnez b une valeur. Donc, quoi qu'il arrive, la valeur b est définie sur est toujours la valeur de la dernière boucle for. La prochaine fois, définissez boolean b = true, if equal = true, ne faites rien, if equal = false, b=false.

Deuxièmement, vous vérifiez maintenant chaque valeur dans array1 avec chaque valeur dans array2. Si je comprends bien, vous avez seulement besoin de vérifier les valeurs au même endroit dans le tableau, ce qui signifie que vous devriez avoir supprimé la deuxième for-loop et vérifier comme ceci: if (array2[i] == array1[i]). Alors votre code devrait fonctionner aussi bien.

code Votre fonctionnerait comme ceci:

public static void compareArrays(int[] array1, int[] array2) { 
    boolean b = true; 
    for (int i = 0; i < array2.length; i++) { 
     if (array2[i] == array1[i]) { 
      System.out.println("true"); 
     } else { 
      b = false; 
      System.out.println("False"); 
     } 
    } 
    return b; 

}

Mais comme l'a dit un autre, plus facile serait: Arrays.equals (ary1, ary2);

+0

PS. J'ai édité une autre réponse par quelqu'un d'autre dans mon texte. Je vissage – Joetjah

+0

:(J'ai essayé ce code et il travaille ok pour le tableau qui dosn't match, mais lorsque les tableaux sont les mêmes j'obtiens vrai et faux imprimé. – user2052514

+0

Je suis désolé, je suis totalement manqué votre 'pause '-Déclaration. C'est en fait assez bon! cela signifie que votre code a seulement 1 défaut, et qui est la double boucle for. – Joetjah

6

Si vous connaissez les tableaux sont de la même taille, il est prouvable plus rapide pour trier puis comparer

Arrays.sort(array1) 
Arrays.sort(array2) 
return Arrays.equals(array1, array2) 

Si vous ne voulez pas changer l'ordre des données dans les tableaux, puis faire un System.arraycopy premier.

+0

['sort()'] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort (int [])) utilise un [quicksort] (http://iaroslavski.narod.ru/quicksort/DualPivotQuicksort.pdf) avec une moyenne de '2 * n * ln (n)' comparaisons, où 'equals()' nécessite juste 'n' compa les risons dans le * pire * cas. Sans parler de changer d'éléments. C'est beaucoup plus lent, pas plus rapide, et même un tri de base optimal serait plus lent. –

+0

@MatthewRead utilise TimSort. La comparaison de toutes les paires d'éléments est 'O (n^2)'. Cela vérifie si les deux tableaux contiennent les mêmes éléments. Vous pouvez seulement vérifier si les tableaux contiennent les mêmes éléments dans le même ordre dans 'O (n)'. Cela dépend de votre concept d'égalité mais votre suggestion et cette réponse sont ** non équivalentes **. –

55

D'après ce que si cela est vrai, je vois que vous essayez juste pour voir si elles sont égales, juste aller avec quelque chose comme ceci:

boolean areEqual = Arrays.equals(arr1, arr2); 

C'est le moyen standard de le faire.

Ops, il coutures que les tableaux doivent également être classés pour être considérés comme égaux, de la doc java:

« Deux tableaux sont considérés comme égaux si les deux tableaux contiennent le même nombre d'éléments, et toutes les paires correspondantes les éléments des deux tableaux sont égaux, c'est-à-dire que deux tableaux sont égaux s'ils contiennent les mêmes éléments dans le même ordre "

Désolé de le manquer.

+14

Arrays.sort() ne retourne pas le tableau trié –

+9

Le tri des tableaux est complètement faux. Imaginez deux tableaux 'a = {0, 1}' et 'b = {1, 0}'. Ils ne sont absolument pas égaux, mais le tri et la comparaison diraient que c'est le cas. Ce que vous faites est de trouver, s'il y a les mêmes éléments dans le tableau, mais c'est une chose différente. – Petr

+2

Je pense que cette réponse était juste jusqu'à ce qu'ils ajoutent le genre, et c'est ainsi que cela a eu les upvotes originales. – Paul

31

utilisation
Arrays.equals(ary1,ary2); // renvoie la valeur booléenne

EDIT
vous pouvez utiliser Arrays.deepEquals(ary1,ary2) pour comparer des tableaux 2D ainsi

également vérifier this link pour entre Arrays.equls(ar1,ar2) comparision et comparision Arrays.deepEquals(ar1,ar2)

Java Arrays.equals() returns false for two dimensional arrays

EDIT 2
si vous ne voulez pas utiliser ces méthodes de bibliothèque, vous pouvez facilement mettre en œuvre votre méthode comme ceci:

public static boolean ArrayCompare(int[] a, int[] a2) { 
    if (a==a2) // checks for same array reference 
     return true; 
    if (a==null || a2==null) // checks for null arrays 
     return false; 

    int length = a.length; 
    if (a2.length != length) // arrays should be of equal length 
     return false; 

    for (int i=0; i<length; i++) // compare array values 
     if (a[i] != a2[i]) 
      return false; 

    return true; 
} 
+0

@downvoter soin de commenter – exexzian

+0

Lire mon commentaire dans la question de OP. En passant, il a 2 upvotes. –

+0

Je vous remercie très utile – user2052514

1

Vous pouvez vérifier l'égalité de tableau avec la méthode Apache Commons ArrayUtils#isEquals().

+3

Je ne suis pas d'accord avec le downvote. Cela ne répond pas à sa question et il peut toujours plonger dans le code source pour voir comment cela fonctionne ... – tstorms

+0

Encore une fois, lisez mes commentaires dans la question OP. –

+0

ouay pourquoi downvote - il n'y a rien de mal avec cette réponse - même si OP apprend - même alors il n'y a rien de mal à lui présenter ces bibliothèques et méthodes qui sont disponibles – exexzian

1

La longueur des tableaux doivent être les mêmes et les chiffres être la même chose tout au long (1er numéro dans les tableaux doivent être SASME et ainsi de suite)

Sur la base de ce commentaire, alors vous avez déjà votre algorithme:

  1. Vérifiez si les deux tableaux ont la même longueur:

    array1.length == array2.length

  2. Les chiffres doivent être les mêmes dans la même position:

    array1 [x] == array2 [x]

Sachant cela, vous peut créer votre code comme celui-ci (ce n'est pas le code Java, il est un algorithme):

function compareArrays(int[] array1, int[] array2) { 

    if (array1 == null) return false 
    if (array2 == null) return false 

    if array1.length != array2.length then return false 

    for i <- 0 to array1.length - 1 
     if array1[i] != array2[i] return false 

    return true 
} 

Remarque: votre fonction doit renvoyer une boolean, ne pas être un void, puis récupérer la valeur de retour dans une autre variable et l'utiliser pour imprimer le message « vrai » ou « faux »:

public static void main(String[] args) { 
    int[] array1; 
    int[] array2; 
    //initialize the arrays... 
    //fill the arrays with items... 
    //call the compare function 
    boolean arrayEquality = compareArrays(array1, array2); 
    if (arrayEquality) { 
     System.out.println("arrays are equals"); 
    } else { 
     System.out.println("arrays are not equals"); 
    } 
} 
+0

si vous pensez que c'était votre meilleure réponse pour OP pour lui faire apprendre les choses correctement - alors il vaut mieux vérifier quelques autres conditions - vérifier mon édition – exexzian

+0

pour une méthode util robuste, ajouter 'null'-vérifier pour' array1' et ' array2' – oliholz

+0

@oliholz ​​changement fait –

-2

Par souci d'exhaustivité, vous devriez avoir une méthode qui peut vérifier tous tableaux :

public static <E> boolean compareArrays(E[] array1, E[] array2) { 
     boolean b = true; 
     for (int i = 0; i < array2.length; i++) { 
     if (array2[i].equals(array1[i])) {// For String Compare 
      System.out.println("true"); 
     } else { 
      b = false; 
      System.out.println("False"); 
     } 
     } 
     return b; 
    } 
+0

Cela ne répond vraiment pas à la question du tout. Cette fonction ne peut pas être utilisée pour les tableaux * all *, en particulier elle échoue pour les tableaux * int *. –

2

Aucune des réponses existantes n'implique l'utilisation d'un comparateur et ne peut donc pas être utilisée dans les arbres binaires ou pour le tri. Donc, je vais juste laisser ceci ici:

public static int compareIntArrays(int[] a, int[] b) { 
    if (a == null) { 
     return b == null ? 0 : -1; 
    } 
    if (b == null) { 
     return 1; 
    } 
    int cmp = a.length - b.length; 
    if (cmp != 0) { 
     return cmp; 
    } 
    for (int i = 0; i < a.length; i++) { 
     cmp = Integer.compare(a[i], b[i]); 
     if (cmp != 0) { 
      return cmp; 
     } 
    } 
    return 0; 
} 
+0

'int cmp = a.length - b.length;' peut retourner n'importe quel int (mais 0), pas nécessairement 1 ou -1 – c0der

+0

@ c0der C'est vrai. En ce qui concerne les comparateurs en Java, tout int négatif peut être retourné pour indiquer «inférieur à», et tout int positif indique «supérieur à». Il ne doit pas être l'un de {-1,0,1} – etherous

+0

Lecture https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare(T,%20T) I voir: "défini pour renvoyer un de -1, 0 ou 1" – c0der

0

Voici mon approche, il peut être utile à d'autres.

public static void compareArrays(int[] array1, int[] array2) { 
    if (array1.length != array2.length) 
    { 
      System.out.println("Not Equal"); 
    } 
    else 
    { 
     int temp = 0; 
     for (int i = 0; i < array2.length; i++) { //Take any one of the array size 
      temp^ = array1[i]^array2[i]; //with help of xor operator to find two array are equal or not     
     } 
     if(temp == 0) 
     { 
      System.out.println("Equal"); 
     } 
     else{ 
      System.out.println("Not Equal"); 
     } 
    } 
} 
Questions connexes