2013-12-16 67 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; 
    } 
}