【问题标题】:How to use in indexOf with a List out of int[][]?如何在 indexOf 中使用 int[][] 中的 List?
【发布时间】:2016-06-24 02:27:12
【问题描述】:

这是我创建的有效方法。我使用了 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

【问题讨论】:

  • 为什么在你的例子中索引应该是4?
  • 作为示例,它将是添加到矩阵列表的第 5 个矩阵。所以这将使它成为索引 4。只要它返回正确的索引,它就具有与矩阵相同的值。您可以在输出中看到 matrice[4] == index
  • copy2dArray 可能不会返回完全相同的对象,indexOf 将搜索 matrix 对象,而不是副本(因为数组的默认 equals 方法是 @987654329 @ ) .
  • 是的,我也是这么想的,但是你知道我该如何解决这个问题吗?我确实需要继续使用 ArrayList。
  • 我选择了一个合适的遮阳篷,这不是让它成为合适的遮阳篷吗?

标签: java arraylist multidimensional-array contains indexof


【解决方案1】:

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

【讨论】:

  • 那我也能得到索引吗?
  • @user2173361 是的,通过正确的 equals() 实现,您将获得矩阵的索引(如果它在列表中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多