-3

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

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);
        }

    }

}

输出: zfeca-6

为什么-2当我将“y”作为我的查询参数传递并且-5当我传递时它会打印出来b如果找不到结果,谁能告诉我发生了什么。

4

2 回答 2

13

我不太了解 Java,但 Google 给了我这个链接

如果搜索失败,则返回值指示插入点- 您可以在其中插入搜索项的索引,并保留排序顺序。所以你可以将它与成功的结果区分开来,插入点的值总是负数。

实际返回值为-(insertpoint) - 1. 如果你知道你的二进制补码(有符号整数的二进制表示),你会认识到这是按位而不是插入点。这个值有点有趣,因为任何特定位宽的每个可能的非负整数都有一个负位补码(翻转所有位,包括符号位)。

于 2013-09-27T16:25:14.423 回答
5

Arrays#binarySearch()返回您正在搜索的元素的索引,或者如果未找到,则返回(-index - 1)whereindex是将元素插入排序数组的位置。

来自文档:

返回:
搜索键的索引,如果它包含在数组中;否则,(-(insertion point) - 1)。插入点定义为将键插入数组的点:第一个元素的索引大于键,或者如果数组中的所有元素都小于指定的键,则为 a.length。请注意,这保证了返回值将是>= 0当且仅当找到键时。

现在,随着您的数组排序,"b"将插入在index = 1, 之后"a"。因此返回值为(-1 - 1) = -2

于 2013-09-27T16:21:10.050 回答