检查以整数数组作为元素的数组中是否存在整数数组。 [Java]

Checking if an Integer Array exists in an Array with Integer Arrays as elements. [Java]

public static int Obstacle[][] = {{1, 3}, {2, 2}};

public static boolean testerFunction(int j, int k) {
    int check[] = {j, k};
    if (Arrays.asList(Obstacle).contains(check)) {
        return true;
    }
    else {
        return false;
    }
}

我有这个代码。

它总是 returns 错误,尽管检查等于 {1,3} 或 {2,2}

我的代码有什么问题?如何检查Java中的数组数组中是否存在数组?

您正在检查引用相等性而不是对象相等性。请参阅下面使用 Arrays.equals.

进行对象相等性检查
int[] a1 = { 1, 2 };
int[] a2 = { 1, 2 };
System.out.println(a1 == a2); // false (two different instances)
System.out.println(Arrays.equals(a1, a2)); // true (instances are logically equal)

也考虑这个测试:

System.out.println(a1.equals(a2)); // false

对于 Java 中的大多数对象,这应该是 return true,因为 a1a2 在逻辑上是相等的。但是,Array 不会覆盖 Object.equals(),因此它会回退到默认的引用相等性检查 ==。这就是你的测试 if (Arrays.asList(Obstacle).contains(check)) 没有通过的根本原因。 Collections.contains() 使用 Object.equals 来比较数组。这就是为什么我们必须手动遍历外部数组,如下所示:

public static int[][] obstacle = { { 1, 3 }, { 2, 2 } };

public static boolean testerFunction(int j, int k) {
  int[] check = { j, k };
  for (int[] a : obstacle) {
    if (Arrays.equals(a, check)) {
      return true;
    }
  }
  return false;
}

public static void main(String[] args) {
  System.out.println(testerFunction(1, 3)); // true
  System.out.println(testerFunction(2, 2)); // true
  System.out.println(testerFunction(0, 0)); // false
}

您的代码的问题在于,虽然数组元素可能是等效的,但封闭数组却不是。

考虑以下示例:

int[] a = {1, 2, 3}
int[] b = {1, 2, 3}

System.out.println(a == b); //Prints false

虽然数组 ab 都包含元素 1、2 和 3,但它们在功能上是不同的数组,占用不同的内存空间。

实现您想要的唯一方法是通过手动循环、取消引用和比较以确定元素是否相等(或使用 Arrays.equals() 等内置方法)。

一个示例解决方案是:

public static boolean testerFunction(int... elems){
    for(int[] candidate : Obsticle){
        // Filter out null and mismatching length arrays.
        if(candidate == null || candidate.length != elems.length){
            continue;
        }

        // Check equivilence using Arrays.equals()
        if(Arrays.equals(candidate, elems)){
            return true;
        }
    }

    // No arrays matched, return false
    return false;
}

只是想参与 Java 8 的解决方案:

public boolean testerFunction(int[][] arr2d, int... ints) {
    return Arrays.stream(arr2d).anyMatch(arr -> Arrays.equals(arr, ints));
}

请注意,第二个参数是可变参数数组,显然可以像 OP 示例中那样将其更改为简单地采用两个整数。

该示例使用 Java 8 个流,您可以找到 great tutorial on streams here.