Java 检查以整数数组作为元素的数组中是否存在整数数组。[爪哇]
我有这个密码 它总是返回false,尽管check等于{1,3}或{2,2}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}
我的代码有什么问题?如何检查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));
}