如何在indexOf中使用带有int [] []的List?

时间:2016-03-09 15:48:11

标签: java arraylist multidimensional-array contains indexof

这是我创建的方法。我使用了Arrays.deepEquals。它检查int [] []是否在int [] []之外的ArrayList中。感谢Thomas,给出了解决方案!

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

输出:

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

1 个答案:

答案 0 :(得分:2)

问题是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<>();