我没有关于 Arrays.binarySearch 的更多信息。 Arrays.binarysearch正是他们正在做的事情。为什么3 -3控制台输出;
import java.util.*;
public class VLA2 implements Comparator<VLA2> {
int dishSize;
public static void main(String[] args) {
VLA2[] va = {new VLA2(40), new VLA2(200), new VLA2(60) ,new VLA2(70)};
Arrays.sort(va, va[0]);
int index = Arrays.binarySearch(va, new VLA2(40), va[0]);
System.out.print(index + " ");
index = Arrays.binarySearch(va, new VLA2(69), va[0]);
System.out.print(index);
}
public int compare(VLA2 a, VLA2 b) {
return b.dishSize - a.dishSize;
}
VLA2(int d) { dishSize = d; }
}
答案 0 :(得分:2)
您的数组已排序为{200, 70, 60, 40}
,因为compare()
方法在a.dishSize < b.dishSize
时返回正值。
因此,当您搜索VLA2(40)时,您会在第3位找到它。
搜索VLA2(69)时,找不到它。因此,根据定义,方法的返回值为-insertion_point - 1
。在这种情况下,插入点将为2,因此返回值为-3。
Arrays.sort()
方法按升序排序。但成员之间的关系由比较器定义。 根据定义,当比较符时,比较器必须返回负值。 b,当a> 1时为正值。 b。如果您希望升序自然,请更改compare()
方法以返回a.dishSize - b.dishSize。
顺便说一下,对象作为自己的比较器是不常见的。理想情况下,一个类只代表一个概念。在这种情况下,将两个概念混合到一个类中会产生如下调用:
int index = Arrays.binarySearch(va, new VLA2(40), va[0]);
在这里,您传递的是va [0],而不是将其用作VLA2值,而是将其用作比较器。这可能有些令人困惑。
答案 1 :(得分:1)
对数组进行排序后,它看起来就像 {200,70,60,40},因为你的比较器按降序排序。
int index = Arrays.binarySearch(va, new VLA2(40), va[0]);
这将在排序数组中返回40的索引,即3
如果元素不在数组中,binarySearch方法将返回( - (插入点)-1)。插入点是应插入元素的索引,以使数组按排序顺序排列。 在这里
index = Arrays.binarySearch(va, new VLA2(69), va[0]);
要保持数组排序69应插入index = 2
{200,70,69,60,40}
所以(-2)-1 = -3。所以二进制搜索返回-3。
请注意,69不会被插入。只有插入点将由binarySearch函数计算。
如果您正在寻找269,
要保持数组排序269应插入index = 0
{269,200,70,...}
所以binarySearch()
返回-0-1 = -1