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

Java 检查以整数数组作为元素的数组中是否存在整数数组。[爪哇],java,arrays,object,Java,Arrays,Object,我有这个密码 它总是返回false,尽管check等于{1,3}或{2,2} 我的代码有什么问题?如何检查Java中的数组数组中是否存在数组?您检查的是引用相等,而不是对象相等。有关使用数组.equals进行对象相等性检查的信息,请参见下文 public static int Obstacle[][] = {{1, 3}, {2, 2}}; public static boolean testerFunction(int j, int k) { int check[] = {j, k}

我有这个密码

它总是返回false,尽管check等于{1,3}或{2,2}


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

您检查的是引用相等,而不是对象相等。有关使用
数组.equals进行对象相等性检查的信息,请参见下文

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

也考虑这个测试:

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)
对于Java中的大多数对象,这应该返回true,因为
a1
a2
在逻辑上是相等的。但是,
数组
不会覆盖
对象.equals()
,因此它会返回到引用相等的默认检查
=
。这就是为什么您的测试
if(Arrays.asList(障碍).contains(检查))
无法通过的根本原因
Collections.contains()
使用
Object.equals
比较数组。这就是为什么我们必须手动迭代外部数组,如下所示:

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

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

考虑以下示例:

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
}
虽然数组
a
b
都包含元素1、2和3,但它们在功能上是不同的数组,占用不同的内存空间

实现所需的唯一方法是通过手动循环、解引用和比较来确定元素是否相等(或使用内置方法,如
Arrays.equals()

一个例子是:

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

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

另外,我想介绍一下Java 8解决方案:

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;
}
请注意,第二个参数是varargs数组,显然可以将其更改为只取两个int,如OPs示例中所示


该示例使用Java 8流,您可以找到一个。

您的意思是引用相等吗?因为实例和对象是完全相同的!我解释了我的意思,如果这些术语对你来说是模棱两可的,诚然它们是可以的。我将编辑它并将其发布到“引用质量”中,因为这是JLS使用的,尽管快速的web搜索将显示“实例平等”通常用于表示相同的东西,正如“值平等”用作“对象平等”的同义词一样。如果我在这里重新定义约定,我想我会将术语更改为“对象平等”vs“对象等价性。”本质上你会被问到“这个对象是同一个对象吗”vs“这个对象是等价的对象吗”。同样的,我打赌
object.equals()
是否被命名为
object.isEquivalentTo()
它可能会让新手的工作稍微容易一些……但另一方面,它的可读性较差。array.equals(…)不是对象相等,或者其他任何东西。它是一种静态实用方法,使用两个数组作为输入。这个答案是正确的,但我认为应该为OP的好处解释更多的细节。原始代码失败,因为尽管
Collection#contains()
使用
equals(…)比较元素
,数组不重写
等于(…)
。您可以将此行添加到第一个代码示例:
System.out.println(a1.equals(a2));//false(默认等于方法测试引用相等,而不是逻辑相等)
public boolean testerFunction(int[][] arr2d, int... ints) {
    return Arrays.stream(arr2d).anyMatch(arr -> Arrays.equals(arr, ints));
}