5

我有两个关于 Java 数组的问题,希望你能抽出时间来帮助我。

问题一:

int[] intArray1 = { 1, 4, 2, 5, 6, 7, 2 };  
int[] intArray2 = { 1, 4, 2, 5, 6, 7, 2 };

intArray1.equals(intArray2);

但它返回false?

问题2:

我运行这段代码:

int[] intArray1 = { 1, 4, 2, 5, 6, 7, 2 };  //2 is duplicated
Arrays.binarySearch(intArray1,2);

它返回-2。

但是当我删除重复时:

int[] intArray3 = { 1, 4, 2, 5, 6, 7}; // nothing is duplicated
Arrays.binarySearch(intArray1,2);

现在它返回 2,这是正确的。

我不知道数组中的二进制搜索如何处理导致-2的重复?

4

6 回答 6

7

关于问题 1:数组继承equals()from的默认实现,仅当两个对象相同时才Object返回。true您可以使用以下方法测试数组的内容是否相等:

Arrays.equals(intArray1, intArray2);

关于问题 2:除非数组已排序,否则二进制搜索会返回不可预测的(并且通常是错误的)结果。它恰好适用于特定的未排序数组是巧合。

于 2012-09-30T07:51:49.450 回答
5

在未排序的数组上调用 binarySearch 时,通常会得到奇怪的结果。它在javadoc中是明确的:

使用二进制搜索算法在指定的整数数组中搜索指定的值。在进行此调用之前,必须对数组进行排序(如上面的 sort 方法)。如果未排序,则结果未定义。如果数组包含多个具有指定值的元素,则无法保证会找到哪一个。

应有的equals回报false:您创建了两个不同的数组,并equals告诉您这两个数组是不同的,尽管它们的内容相似。Arrays.equals实现您打算使用的结构比较。

于 2012-09-30T07:50:28.093 回答
4

Java 中的数组对象不会覆盖该equals()方法。因此,您必须使用实用程序方法Arrays.equals()

Arrays.equals(intArray1, intArray2);

二进制搜索仅适用于已排序的数组

Arrays.sort(intArray1);
于 2012-09-30T07:52:10.073 回答
2

问题一:

在这种情况下,equals比较对象(即指针)而不是它们的内容。您已经创建了两个不同的对象并按预期equals返回。false

于 2012-09-30T07:50:38.383 回答
1

问题#1:equals()方法比较对象的引用,而不是引用中的内容。因此,对于您的情况,equals() 方法失败。一种比较方法是使用Arrays.equals(int[] a, int[] a2)。根据Javadoc:

如果两个指定的 Objects 数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中所有对应的元素对相等,则认为这两个数组相等。如果 (e1==null ? e2==null : e1.equals(e2)),则认为两个对象 e1 和 e2 相等。换句话说,如果两个数组以相同的顺序包含相同的元素,则它们是相等的。此外,如果两个数组引用都为空,则认为两个数组引用相等。

问题 #2 :来自binarySearch(int[] a, int key)的 Javadoc :

使用二进制搜索算法在指定的整数数组中搜索指定的值。在进行此调用之前,必须对数组进行排序(如通过 sort(int[]) 方法)。如果未排序,则结果未定义。如果数组包含多个具有指定值的元素,则无法保证会找到哪一个。

因此,您需要一个已排序且没有重复的数组才能使此方法正常工作。

于 2012-09-30T07:54:26.023 回答
0

-首先对 a 应用二分搜索sorted array,这就是异常行为的原因。

-其次,你应该使用方法Arrays.equals():

Arrays.equals(intArray1, intArray2);

于 2012-09-30T08:37:40.027 回答