2012-02-29 2 views
0

Im пытается сравнить два 2D-массива, используя это. Но я продолжаю получать «Массивы не совпадают.« даже если они одинаковые.Сравнение 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."); 

Я тоже не могу этого сделать. boolean check1 = Arrays.equals (a2 [i] [j], a3 [i] [j]);

+2

Это потому, что вы не можете сравнивать 2D-массивы, подобные этому. –

+0

Как я могу это сделать? –

+0

Проверяя одну строку 1D за раз. –

ответ

4

Первый не работает, потому что массив с двумя D-массивами действительно представляет собой массив массивов (то есть массив объектов). Метод 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
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.

Я надеюсь, что это поможет.

Смежные вопросы