2016-03-09 55 views
1

這是我創建的方法。我使用了Arrays.deepEquals。它檢查int [] []是否在int [] []之外的ArrayList中。謝謝Thomas,給出解決方案!如何在indexOf中使用list [out] int [] []?

public boolean contains(int[][]matrix1, List<int[][]> matrice){ 
boolean contains = false; 
    for(int[][] m : matrice){ 
    if(Arrays.deepEquals(m, matrix)){ 
     contains = true; 
     index = matrice.indexOf(m); 
    } 
    } 
    return contains; 
} 

我有以下代碼。我想從矩陣中得到與矩陣具有相同值的索引。我認爲它不起作用,因爲我正在檢查引用而不是值。我無法弄清楚它應該如何完成。

List<int[2][2]> matrice = new ArrayList<int[][]>(); 
    int[][] matrix = new int[2][2] 
    public void testMethod(){ 
     // here matrix gets a value 
     matrix = {{1,4}{3,2}}; 
     //Here List matrice gets filled with different matrice (4x) 
     ... 
    //add a copy of matrix to matrice 
     matrice.add(copy2dArray(matrix)); 
     int index = matrice.indexOf(matrix); 
     System.out.println("matrix ->"Arrays.deepToString(matrix)); 
     System.out.println("matrice[4] ->"Arrays.deepToString(matrice[4])); 
     System.out.println("index = "+index); 
     System.out.println(matrice.contains(matrix)); 
    } 

     private int[][] copy2dArray(int[][] original){ 
      int[][] copy = new int[original.length][]; 
      for(int i = 0; i < original.length; i++){ 
       copy[i] = Arrays.copyOf(original[i], original[i].length); 
      } 
      return copy; 
     } 

OUTPUT:

matrix -> [[1,4],[3,2]] 
matrice[4] -> [[1,4],[3,2]] 
index = -1 
false 

輸出應爲:

matrix -> [[1,4],[3,2]] 
matrice[4] -> [[1,4],[3,2]] 
index = 4 
true 
+0

指數爲什麼要在你的榜樣4? – Thomas

+0

只是作爲一個例子,它將第5矩陣添加到矩陣列表。所以這會使它索引4.只要它給出正確的索引,它就具有與矩陣相同的值。你可以在輸出中看到矩陣[4] ==索引 – user2173361

+0

'copy2dArray'可能不會返回完全相同的對象,'indexOf'將搜索'matrix'對象,而不是副本(默認爲「equals數組的方法是'array1 == array2')。 – Berger

回答

3

的問題是,ArrayList.indexOf()(如大多數其他的實施方式)遍歷元素和調用每個equals()直到一個火柴。然後返回索引,在你的例子中應該是0(不是4)。

然而,陣列不定義自己的equals()實施,從而在Object定義的默認實現,這隻有當數組是完全相同的情況下(這是由於你複製他們的陣列返回true不)。

爲了解決這個問題,您可以使用包含該數組的包裝並適當地實施equals()(和hashCode())。這種「包裝」可稱爲Matrix大概也將導致更好的設計反正;)

例子:

class Matrix { 
    int[][] theCells; 

    public boolean equals(Object o) { 
    //compare the indivual arrays, e.g. by using `Arrays.deepEquals()`, 
    //which takes care of multidimensional arrays 
    } 
} 

List<Matrix> matrices = new ArrayList<>(); 
+0

那麼我能得到索引嗎? – user2173361

+0

@ user2173361是的,通過equals()的正確實現,您將獲得矩陣的索引(如果它在列表中)。 – Thomas