2013-02-15 3 views
21

Я пытаюсь написать код для сравнения двух массивов. В первом массиве я поместил свои собственные цифры, а второй массив принимает числа из входного файла. Размер этого массива определяется первым числом в файле, тогда как первый массив всегда имеет размер 10. Длина должна быть одинаковой как для массивов, так и для чисел. Мой код ниже:Сравнение двух целых массивов в 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

И какая у вас проблема? – Rich

+2

@Rich похоже, что OP не сравнивает массивы вообще. Просто прочитайте код –

+0

В чем вопрос? Разве это не работает? – thegrinner

ответ

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

Лучше напечатать false и разбить цикл в первом экземпляре двух элементов, не равных. Аналогичным образом, возвращает false, если метод имеет тип boolean. Это бессмысленно и ресурс неэффективен, чтобы перебирать 1000 элементов, если первый отличается. Я бы также утверждал, что вернуло логическое значение, и печать была лучше. Таким образом, метод можно использовать, даже если вы хотите спокойно проверить равенство. Хотя этот ответ, возможно, служил ОП, я думаю, что ответ exexzian более полный. – Reti43

+0

Отлично работает, Это то, что я ожидал от своего кода. –

1

Даже если есть что-то легко, как .equals, я хотел бы отметить две ошибки, которые вы сделали в своем коде. Первое: когда вы проходите через массивы, вы говорите, что b: true или false. Затем вы снова начинаете проверять, из-за цикла for. Но каждый раз, когда вы даете b значение. Таким образом, независимо от того, что происходит, значение b получает значение, всегда является значением LAST for-loop. В следующий раз установите boolean b = true, if equal = true, ничего не сделайте, if equal = false, b=false.

Во-вторых, вы теперь проверяете каждое значение в array1 с каждым значением в array2. Если я правильно понимаю, вам нужно только проверить значения в том же месте в массиве, то есть вы должны удалить второй цикл for и проверить вот так: if (array2[i] == array1[i]). Тогда ваш код также должен функционировать.

Ваш код будет выглядеть так:

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; 

}

Но как сказал другой, проще было бы: Arrays.equals (ary1, ary2);

+0

PS. Я отредактировал другой ответ другого человека в моем тексте. Я задираю :( – Joetjah

+0

Я пробовал этот код, и он работает нормально для массива, который не соответствует, но когда массивы одинаковы, я получаю истинную и ложную распечатку. – user2052514

+0

Прошу прощения, я полностью пропустил ваш разрыв '-statement. Это на самом деле довольно правильно! Это означает, что ваш код имеет только один недостаток, и это двойной цикл for. – Joetjah

6

Если вы знаете, массивы имеют одинаковый размер, то он доказуемо быстрее сортировать затем сравнить

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

Если вы не хотите, чтобы изменить порядок следования данных в массивах затем сделать System.arraycopy первым.

+0

['sort()'] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort (int [])) использует [quicksort] (http://iaroslavski.narod.ru/quicksort/DualPivotQuicksort.pdf) со средним значением '2 * n * ln (n)' сравнения, wherease 'equals()' просто требует 'n' compa ризонов в случае «худшего». Не говоря уже о фактических обмена элементах. Это намного медленнее, а не быстрее, и даже оптимальная сортировка по методу радикса будет медленнее. –

+0

@MatthewRead использует TimSort. Сравнение всех пар элементов - «O (n^2)». Это проверяет, содержат ли в обоих массивах _same elements_. Вы можете только проверить, содержат ли массивы одни и те же элементы в том же порядке_ в 'O (n)'. Это зависит от вашей концепции равенства, но ваше предложение и этот ответ ** не эквивалентны **. –

55

Из того, что я вижу, вы просто попытаться увидеть, если они равны, если это правда, просто идти с чем-то вроде этого:

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

Это стандартный способ сделать это.

Опс, швы, что массивы должны быть также сортируются считать равным, из Java Doc:

«Два массива считаются равными, если оба массива содержат одинаковое количество элементов, и все соответствующие пары Другими словами, два массива равны, если они содержат одни и те же элементы в одном порядке "

Извините за отсутствие этого.

+14

Arrays.sort() не возвращает отсортированный массив –

+9

Сортировка массивов совершенно неверна. Представьте себе два массива 'a = {0, 1}' и 'b = {1, 0}'. Они совершенно не равны, но сортировка и сравнение их могли бы сказать, что это так. То, что вы делаете, - это найти, если в массиве есть одни и те же элементы, но это совсем другое. – Petr

+2

Я думаю, что этот ответ был прав до тех пор, пока они не добавили сортировку, и именно так получилось оригинальное преимущество. – Paul

31

использование
Arrays.equals(ary1,ary2); // возвращает булево значение

EDIT
вы можете использовать Arrays.deepEquals(ary1,ary2) для сравнения 2D массивов а

также проверить this link для СРАВНЕНИЯ СРАВНЕНИЯ между Arrays.equls(ar1,ar2) и Arrays.deepEquals(ar1,ar2)

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

EDIT 2
, если вы не хотите использовать эти методы библиотеки, то вы можете легко реализовать свой метод так:

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 прокомментируйте – exexzian

+0

Прочитайте мой комментарий в вопросе OP. Кстати, у этого есть 2 upvotes. –

+0

Спасибо вам большое – user2052514

1

Вы можете проверить массив равенства с Apache Commons ArrayUtils#isEquals() метод.

+3

Я не согласен с нижним рейтингом. Это делает его вопрос, и он всегда может погрузиться в исходный код, чтобы увидеть, как он работает ... – tstorms

+0

Снова прочитайте мои комментарии в вопросе OP. –

+0

Да, давайте спуститься вниз - нет ничего плохого в этом ответе, даже если OP учится - даже тогда нет ничего плохого в том, чтобы познакомить его с этими библиотеками и методами, которые доступны – exexzian

1

Длина массивов должны быть одинаковыми и цифры просто быть одинаковым по всему (1-го номера в массивах должны быть sasme и так далее)

На основе этого комментария то у вас уже есть свой алгоритм:

  1. Проверьте, если оба массива имеют одинаковую длину:

    array1.length == array2.length

  2. Числа должны быть одинаковыми в том же положении:

    array1 [х] == array2 [х]

Зная это, может создать подобный код (это не Java-код, это алгоритм):

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 
} 

Примечание: Ваша функция должна возвращать boolean, не будучи void, затем восстановить возвращаемое значение в другой переменной и использовать его, чтобы напечатать сообщение «истинный» или «ложный»:

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

, если вы считаете, что это ваш лучший ответ для OP, чтобы он научился правильно - тогда вам лучше проверить еще несколько условий - проверьте мое редактирование – exexzian

+0

для надежного метода использования, добавьте 'null'-check для' array1' и ' array2' – oliholz

+0

@oliholz ​​изменение сделано –

-2

Для полноты картины, вы должны иметь метод, который может проверить все массивы :

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

Это действительно не отвечает на вопрос вообще. Эта функция не может использоваться для * all * массивов, особенно для массивов * int *. –

2

Ни один из существующих ответов не предполагает использование компаратора и поэтому не может использоваться в двоичных деревьях или для сортировки. Поэтому я просто собираюсь оставить это здесь:

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;' может возвращать любой int (но 0), не обязательно 1 или -1 – c0der

+0

@ c0der Это правда. Когда дело доходит до компараторов в Java, любой отрицательный int может быть возвращен, чтобы указать «меньше», а любой положительный int указывает «больше, чем». Он не должен быть одним из {-1,0,1} – etherous

+0

Чтение https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare(T,%20T) I см. «Определено для возврата одного из -1, 0 или 1» – c0der

0

Здесь мой подход, он может быть полезен другим.

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"); 
     } 
    } 
} 
Смежные вопросы