检查具有整数数组的数组中是否存在整数数组作为元素。 【JAVA]

时间:2015-02-07 20:36:26

标签: java arrays object

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

我有这段代码。

尽管检查等于{1,3}或{2,2}

,但它总是返回false

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

3 个答案:

答案 0 :(得分:2)

您正在检查引用相等性而不是对象相等性。请参阅下面的使用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中的大多数对象,由于a1a2在逻辑上相等,因此预期会返回true。但是,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
}

答案 1 :(得分:0)

你的代码的问题是虽然数组元素可能是等价的,但封闭的数组不是。

考虑以下示例:

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

答案 2 :(得分:0)

也可以参与Java 8解决方案:

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

请注意,第二个参数是一个varargs数组,显然可以更改为只需要两个整数,如OPs示例所示。

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