我正在编写一个程序,其中有一个名为" equals"测试两个二维数组是否相等"对彼此。 equals返回两个args在这个意义上是否相等 如果两个args都为null,则返回true 如果一个arg为null而另一个不是,则返回false; 如果2个数组具有不同的行数,则返回false 否则,返回arr1中的每个元素是否等于arr2中的对应元素,因为两个元素都是null,或者两个元素都引用具有相同数量的int且具有相同顺序的相同值的数组。
等于方法定义:
public static boolean equals( int[][] arr1, int[][] arr2){
//both are null references
if(arr1 == null && arr2 == null)
return true;
//only one is a null reference
if ((arr1 == null && arr2 != null) || (arr1 == null && arr2 != null))
return false;
//number of rows not identical
if( arr1.length != arr2.length )
return false;
for(int i = 0 ; i < arr1.length; i++){ //checking row equivalence
if(arr1[i] == null && arr2[i]==null){ //both null
continue;
}
if(arr1[i] == null || arr2[i] == null) //one is null
return false;
else if(arr1[i].length != arr2[i].length){
return false;
}
else{
for(int j = 0; j < arr1[i].length; i++){ //#of columns equal, compare them
System.out.println(i + "," + j); //helps debug
if(arr1[i][j] != arr2[i][j])
return false;
}
}
}
return true;
} //equals
当我打电话
equals( new int[][]{{1,2},{3,4},null}, new int[][]{{1,2},null,{3,4}} )
我的程序崩溃,抛出NullPointerException。
Eclipse说它在这一行失败了:
if(arr1[i][j] != arr2[i][j])
问题是,据我所知,我的程序不应该进入该行所在的封闭for循环。它应该在此时返回false:
if(arr1[i] == null || arr2[i] == null) //one is null
return false;
我在这里做错了什么?谢谢。
答案 0 :(得分:3)
你有缺陷,
if ((arr1 == null && arr2 != null) || (arr1 == null && arr2 != null))
应该是
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null))
因为否则您不会测试 arr1
和arr2
。 然而,我更希望Arrays.deepEquals(Object[], Object[])
如果两个指定的数组彼此非常相等,则返回true ...如果两个数组引用都为null,则认为两个数组引用非常相等,或者如果它们引用包含相同数量元素的数组,并且两个数组中所有相应的元素对都非常相等。 like
public static boolean equals(int[][] arr1, int[][] arr2) {
return Arrays.deepEquals(arr1, arr2);
}