比较不同对象类型的二维数组



我已经编写了一个方法来比较不同的2D数组和输出是否使用.equals相同。在我的主测试类中,我比较两个2D整数数组彼此相同,因此输出应该是"真",然后两个2D字符串数组不同,因此输出应该是假。当测试不同的组合时,当我测试相等和不相等的整数数组时,我得到了正确的输出。测试不同大小的数组,正确的输出和测试相等的字符串数组,我得到了正确的输出。

我遇到的问题是,当我测试两个不相等的字符串数组时,程序在它们不相等时返回true,因此输出应该为false。提前感谢任何帮助或提示。

public boolean equals(Object[][] other) {
boolean isEqual = false;
if (myArray.length != other.length) {
return isEqual;
}
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray[i].length; j++) {
if (myArray[i][j].equals(other[i][j])) {
isEqual = true;
} else {
isEqual = false;
}
}
}
return isEqual;
}

测试:

public class TwoDTester {
public static void main(String[] args) {
//Initializing arrays
Integer[][] firstArray = {{2, 3}, {3, 4}, {4, 5}};
Integer[][] secondArray = {{2, 3}, {3, 4}, {4, 5}};
//Creating TwoDArray object for comparisons
TwoDArray first = new TwoDArray(firstArray);
//Testing true or false
System.out.println(first.equals(secondArray));
//Initializing more arrays
String[][] thirdArray = {
{"Hello", "Goodbye"},
{"Hola", "Adios"},
{"Bonjour", "Au revoir"}};
String[][] fourthArray = {
{"Hello", "Goodbye"},
{"Ciao", "Addio"},
{"Bonjour", "Au revoir"}};
//Creating TwoDArray object for comparisons
TwoDArray third = new TwoDArray(thirdArray);
//Testing true or false
System.out.println(third.equals(fourthArray));
}
}

因为您要求数组中每个对应的元素相等,那么当发现不相等的元素时,您应该简单地退出循环。例如,在这种情况下,您可以使用return false;,而仅在循环结束时返回true(这意味着所有对应的元素都相等)。

在您当前的代码中,只考虑最后一个元素(它将用最后两个元素相等的结果覆盖isEqual),而之前的所有值将不被考虑。

同样,如果允许myArray包含null元素,那么考虑使用Objects.equals方法来比较对象是否相等,但这只是一个提示,与当前问题没有真正的关系。

正如@Jems所指出的,还应该注意以下几行:

if (myArray.length != other.length)
{
return isEqual;
}

只测试每个2D数组的行数是否相等。注意,您可能还应该比较每个数组的每一行,以确定它们的列之间是否相等。例如:

if (myArray[i].length != other[i].length)
return false;

更不用说作为null的数组本身应该被检查(即myArray,myArray[i],otherother[i])。

您可以使用Arrays.equals方法的代码并自定义它,使其接受2D数组:

public static void main(String[] args) {
Integer[][] one = {{1, 2}, {3, 4}, {5, 6}, null};
Integer[][] two = {{1, 2}, {3, 4}, {5, 6}, null};
String[][] three = {{"A", "B"}, {"C", "D"}, {"E", null}};
String[][] four = {{"A", "B"}, {"C", "D"}, {"E", null}};
System.out.println(equals2D(one, two)); // true
System.out.println(equals2D(three, four)); // true
}
/**
* The two 2D arrays are equal if they contain the same rows
* in the same order. Also, two array references are considered
* equal if both are 'null'.
*/
public static boolean equals2D(Object[][] a1, Object[][] a2) {
if (a1 == a2) return true;
if (a1 == null || a2 == null || a1.length != a2.length)
return false;
for (int i = 0; i < a1.length; i++)
if (!equals1D(a1[i], a2[i]))
return false;
return true;
}
/**
* The two rows are equal if they contain the same elements
* in the same order. Also, two row references are considered
* equal if both are 'null'.
*/
public static boolean equals1D(Object[] a1, Object[] a2) {
if (a1 == a2) return true;
if (a1 == null || a2 == null || a1.length != a2.length)
return false;
for (int i = 0; i < a1.length; i++)
if (!Objects.equals(a1[i], a2[i]))
return false;
return true;
}

最新更新