当找不到结果时,我得到一个奇怪的输出。
import java.util.Arrays;
import java.util.Comparator;
public class BinarySearch {
public static void main(String args[]) {
String arr[] = { "c", "a", "e", "f", "z" };
MySort ms = new MySort();
Arrays.sort(arr, ms);
for (String c : arr) {
System.out.println(c);
}
System.out.println(Arrays.binarySearch(arr, "b", ms));
}
static class MySort implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
}
}
输出:
z f e c a -6
当我通过“y”作为我的查询参数时,为什么会打印-2
?-5
当我通过b
时。 如果找不到结果,任何人都可以让我知道发生了什么。
答案 0 :(得分:12)
我不太了解Java,但谷歌给了我this link。
如果搜索失败,返回值将指示插入点 - 您可以插入搜索项的索引,并保留已排序的顺序。因此,您可以将其与成功结果区分开来,插入点值始终为负值。
实际返回值为-(insertpoint) - 1
。如果你知道你的二进制补码(有符号整数的二进制表示),你会认为这是插入点的按位而不是。这个值有点令人感兴趣,因为任何特定位宽的每个可能的非负整数都有一个负的位补码(翻转所有位,包括符号位)。
答案 1 :(得分:4)
Arrays#binarySearch()
返回您正在搜索的元素的索引,或者如果找不到它,则返回(-index - 1)
,其中index
是元素插入的位置排序的数组。
来自docs:
<强>返回:强>
搜索键的索引,如果它包含在数组中;否则,(-(insertion point) - 1)
。插入点定义为键将插入到数组中的点:第一个元素的索引大于键,或者如果数组中的所有元素都小于指定键,则为a.length。请注意,当且仅当找到密钥时,这可以保证返回值为>= 0
。
现在,在您的数组已排序后,"b"
将在index = 1
后面"a"
插入(-1 - 1) = -2
。因此返回值为{{1}}