当找不到结果时,二进制搜索的输出奇怪

时间:2013-09-27 16:19:08

标签: java binary-search

当找不到结果时,我得到一个奇怪的输出。

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时。 如果找不到结果,任何人都可以让我知道发生了什么。

2 个答案:

答案 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}}