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

时间:2013-12-16 16:52:45

标签: java android arraylist comparison equals

我有两个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()的错误功能进行比较吗?

4 个答案:

答案 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)

快速解决方案将是:

  • 定义您自己的比较方法whi,它将to 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;
}
相关问题