2013-12-16 38 views
0

我有两个ArrayList是ArrayList<int[]>。我想看看它们是否相同。相同的意思是相同的长度,相同的内容和相同的顺序。我比较的ArrayList像这样:比较等于2 ArrayList <int[]>与等于()

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

回答

1

在快速的解决办法是:

  • 定义自己的比较方法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; 
} 
+0

当我看到所有其他的答案告诉我,我正在采取的路线是不是CORRE ct和我将不得不创建我自己的比较方法,我很害怕它。感谢您在回答中提供比较2'ArrayLists '的方法! – Matt

2

一个ArrayList<int[]>是一个整数数组的列表。所以它看起来像你试图比较一个二维数组,或多或少。当您在ArrayList或其他List上使用equals时,它会使用元素类型的equals函数比较List的每个元素。

问题是,像int[]这样的数组没有特殊的equals函数。数组是对象,对象的默认equals比较引用以查看它们是否相等。因此在ArrayList上使用.equals将返回true,如果ArrayList的元素是int[],都是相同的参考。它不会检查int[]阵列的元素。

要么你需要自己做一个循环;或使您的类型为ArrayList<ArrayList<Integer>>,这将使equals正常工作。

1

我认为你的问题在于,数组的equals方法基本上没有实现,它只匹配对象相等。所以只要两个列表中的坐标数组不是完全相同的对象,它将返回false。

例如,这段代码打印假:

public static void main(String[] args) { 
    int[] a = {1, 2}; 
    int[] b = {1, 2}; 
    System.err.println(a.equals(b)); 
} 

我会建议你通过点与正确实施的equals(和hashCode)函数来代替INT阵列的使用或坐标对象。 (也许是一个lombok @Data对象!)。

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; 
    } 
}