比较 2 个 ArrayList<int[]> 与 equals() 的相等性



我有两个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;
    }
}

最新更新