根据文件:
public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)
使用二进制文件在指定的数组中搜索指定的对象 搜索算法。
数组必须按照升序排序 指定比较器(由sort(T [],Comparator)方法)之前 打电话。
如果未排序,则结果未定义。如果数组包含多个等于指定对象的元素,则没有 保证找到哪一个。
上述是否意味着只有当数组按升序顺序排序时才能使用Arrays.binarySearch
方法?
我测试了它,如下所示
class Unturned {
public static void main(String[] args) {
String[] chars = {"a", "b", "c", "e","f","h","i"};
MySort ms = new MySort();
Arrays.sort(chars, ms);
for(String c : chars ) System.out.print(c + " ");
System.out.println("\n" + Arrays.binarySearch(chars, "d", ms));
}
static class MySort implements Comparator<String> {
public int compare(String a, String b) {
return b.compareTo(a);
} } }
输出:
i h f e c b a
-5
-5将插入点放在值为c且正确的元素处。 (即-4-1)。
为什么文档说数组必须按升序排序?
答案 0 :(得分:5)
它表示“必须根据指定的比较器按升序排序”。粗体部分是关键部分;你的数组确实是根据指定的比较器排序的(因为你只是对它进行了排序!)。
答案 1 :(得分:4)
它要求所有元素都根据Comparator的实现方式而增加。例如你使用反向比较器,所有元素必须是相反的顺序。
为什么文档说数组必须按升序排序?
二进制搜索基于此假设。 http://en.wikipedia.org/wiki/Binary_search_algorithm当它比较中间元素时,它可以假设如果它大于该元素,它也大于中间元素之前的所有元素。如果数组没有特定的顺序,则必须搜索整个数组,也称为强力搜索。
答案 2 :(得分:3)
每个比较器定义给定类型元素的排序。要求仅仅是必须对数组元素进行排序,使得a [0] <0。 ......&lt; a [n-1]用于某些有效的定义&lt;。该定义不必与我们的传统概念相对应。例如数字 - 事实上,它甚至可以被定义为传统的&gt;。