我有两个ArrayList,它们是ArrayList<int[]>
。我想看看它们是否相同。我所说的相同是指相同的长度、相同的内容和相同的顺序。我正在比较ArrayLists如下:
public boolean isWon() {
if(getAllBtnCoords().equals(getAllTVCoords())) {
Toast.makeText(getApplicationContext(), "YOU WON!", Toast.LENGTH_LONG).show();
return true;
} else {
Toast.makeText(getApplicationContext(), "NOT YET...", Toast.LENGTH_LONG).show();
return false;
}
}
我甚至创建了一个ArrayList<int[]>
,然后创建一个新变量,并将其设置为等于已经创建的ArrayList<int[]>
,这样我就可以100%确定它们是相同的。然后我运行isWon()
方法,它总是返回false。
我做错了什么?我是否使用了equals()
的错误函数进行比较?
ArrayList<int[]>
是整数数组的列表。所以看起来你在尝试比较一个二维数组,或多或少。在ArrayList
或任何其他List
上使用equals
时,它会使用元素类型的equals
函数来比较List
中的每个元素。
问题是像int[]
这样的数组没有特殊的equals
函数。数组是对象,对象的默认equals
会比较引用以查看它们是否相等。因此,如果ArrayList
的元素(即int[]
)都是相同的引用,则在ArrayList
上使用.equals
将返回true
。它不会检查int[]
阵列的元素。
要么你需要自己做一个循环;或者将您的类型设置为ArrayList<ArrayList<Integer>>
,这将使equals
工作正常。
快速解决方案是:
- 定义您自己的比较方法whi,该方法将到ArrayList作为输入
- 检查它们中没有一个为空
- 检查两者大小是否相同
- 一个接一个取两个数组
- 检查这些是否具有相同的长度
- 然后遍历所有这些,并检查是否相等
- 如果前面的任何一个都不为真,则返回false,否则将获得匹配项
类似于:
private boolean areArrayEqual(ArrayList<int[]> a, ArrayList<int[]> b) {
if (a == null) return false;
if (b == null) return false;
if (a.size() != b.size()) return false;
for (int i = 0; i < a.size(); i++) {
int x[] = a.get(i);
int y[] = b.get(i);
if (x.length != y.length) return false;
for (int j = 0; j < x.length; j++) {
if (x[j] != y[j]) return false;
}
}
return true;
}
我认为你的问题在于数组的equals方法基本上没有实现,它只在对象相等时匹配。因此,只要两个列表中的坐标数组不是完全相同的对象,它就会返回false。
例如,这段代码打印错误:
public static void main(String[] args) {
int[] a = {1, 2};
int[] b = {1, 2};
System.err.println(a.equals(b));
}
我建议您用一个正确实现的equals(和hashcode)函数来替换Point或Coordinate对象对int数组的使用。(也许是lombok@数据对象!)。
ArrayList
中的Equals在其元素上内部调用Equals。Int数组的实现只是比较不同的引用,所以正确的比较函数应该是
public static boolean intArraysEquals(List<int[]> listOne, List<int[]> listTwo)
{
if(listOne.size() != listTwo.size())
return false;
for(int i = 0, size = listOne.size(); i < size; i++)
{
int[] firstArray = listOne.get(i);
int[] secondArray = listTwo.get(i);
if(!Arrays.equals(firstArray, secondArray))
{
return false;
}
}
return true;
}
比你的isWon()
功能看起来像
public boolean isWon() {
if(intArraysEquals(getAllBtnCoords(), getAllTVCoords())) {
Toast.makeText(getApplicationContext(), "YOU WON!", Toast.LENGTH_LONG).show();
return true;
} else {
Toast.makeText(getApplicationContext(), "NOT YET...", Toast.LENGTH_LONG).show();
return false;
}
}