Сравнение 2D массивов - PullRequest
       24

Сравнение 2D массивов

1 голос
/ 29 февраля 2012

Я пытаюсь сравнить два 2D-массива, используя это.Но я продолжаю получать « Массивы не одинаковы. », даже если они одинаковы.

     int i;
     int j = 0;
     int k;
     int l;

List<Integer> list = new ArrayList<Integer>();
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> zero = new ArrayList<Integer>();

 for ( i = 1; i <= 16; i++) {
    list.add(i);


}

//System.out.println(list); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
Collections.shuffle(list.subList(1, 15));
System.out.println(list);

Collections.replaceAll(list, 16, 0);
   System.out.println(list);


// System.out.println(list); //[11, 5, 10, 9, 7, 0, 6, 1, 3, 14, 2, 4, 15, 13, 12, 8]

int[][] a2 = new int[4][4];
int [][] a3 = new int[4][4];
for ( i = 0; i < 4; i++) {
    for ( j = 0;  j< 4; j++) {


        a2[i][j] = list.get(i*4 + j);
        a3[i][j] = list.get(i*4 + j);
    }

}
for (int[] row : a2) {
System.out.print("[");
for (   int a : row)
    System.out.printf("%4d", a);
System.out.println("]");
}
for (int[] row : a3) {
System.out.print("[");
for (   int a : row)
    System.out.printf("%4d", a);
System.out.println("]");
}
 boolean check1 = Arrays.equals(a2, a3);
if(check1 == false)
System.out.println("Arrays are not same.");
else
System.out.println("Both Arrays are same.");

Я тоже так не могу.логическое check1 = Arrays.equals (a2 [i] [j], a3 [i] [j]);

Ответы [ 2 ]

7 голосов
/ 29 февраля 2012

Первый из них не работает, потому что двумерный массив int на самом деле является массивом массивов (то есть массивом объектов). Метод Arrays.equals() для массива объектов использует equals(), чтобы проверить, равны ли соответствующие элементы. К сожалению для вашего кода, equals() для массивов является реализацией Object по умолчанию: они equal(), только если они идентичны объекту. В вашем случае это не так.

Во втором случае, когда вы кодируете Arrays.equals и передаете два значения int, компилятор не может сопоставить его ни с одной сигнатурой класса Arrays.

Один из способов проверить равенство - использовать deepEquals:

boolean check1 = Arrays.deepEquals(a2, a3);

Другой способ - явная итерация внешнего массива:

boolean check1 = true;
for (int i = 0; check1 && i < a2.length; ++i) {
    check1 = Arrays.equals(a2[i], a3[i]);
}
3 голосов
/ 29 февраля 2012
boolean check1 = Arrays.deepEquals(a2, a3);

это определенно возможно.Реализация этого использует Object[], который может быть привлекательным для вас, потому что он проверяет типы массивов, которые вы передаете на лету.

Но если вы хотите более строгую типизацию и немного меньше накладных расходов, выможете написать свой собственный следующим образом.

import java.util.Arrays;

/**
 * Operations on multi-dimensional arrays.
 * 
 * @author stephen harrison
 */
public class ArrayUtils {
    private ArrayUtils() {
        // Static methods only
    }

    public static <T> boolean equals(final T[][] a, final T[][] b) {
        if (a == b) {
            return true;
        }

        if (a == null || b == null) {
            return false;
        }

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

    public static <T> boolean equals(final T[][][] a, final T[][][] b) {
        if (a == b) {
            return true;
        }

        if (a == null || b == null) {
            return false;
        }

        if (a.length != b.length) {
            return false;
        }

        for (int i = 0; i < a.length; ++i) {
            if (!equals(a[i], b[i])) {
                return false;
            }
        }

        return true;
    }
}

Первый equals на 2D-массивах вызывает Arrays.equals().3D-версия также называет 2D-версию.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...