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中的数组数组中是否存在数组?
答案 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中的大多数对象,由于a1
和a2
在逻辑上相等,因此预期会返回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
虽然数组a
和b
都包含元素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。