我有两个ArrayList<int[]>
的ArrayLists。我想看看它们是否相同。相同的意思是相同的长度,相同的内容和相同的顺序。我正在比较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()
的错误功能进行比较吗?
答案 0 :(得分:2)
ArrayList<int[]>
是整数数组的列表。所以看起来你正试图或多或少地比较一个二维数组。在equals
或任何其他ArrayList
上使用List
时,它会使用元素类型的List
函数比较equals
的每个元素。
问题是像int[]
这样的数组没有特殊的equals
函数。数组是对象,对象的默认equals
比较引用以查看它们是否相等。因此,如果.equals
的{{1}}元素都是ArrayList
,则true
上的ArrayList
将返回int[]
。它不会检查int[]
数组的元素。
你需要自己做一个循环;或者将您的类型设为ArrayList<ArrayList<Integer>>
,这样可以使equals
正常工作。
答案 1 :(得分:1)
我认为你的问题在于数组的equals方法基本上没有实现,它只匹配对象相等性。因此,只要两个列表中的坐标数组不是完全相同的对象,它就会返回false。
例如,这段代码打印为false:
public static void main(String[] args) {
int[] a = {1, 2};
int[] b = {1, 2};
System.err.println(a.equals(b));
}
我建议你用Point或Coordinate对象用正确实现的equals(和hashcode)函数替换int数组的用法。 (也许是一个lombok @Data对象!)。
答案 2 :(得分:1)
ArrayList
中的等于内部调用其元素的等于。 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;
}
}
答案 3 :(得分:1)
快速解决方案将是:
类似的东西:
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;
}