在Java中,为什么在使用二进制搜索搜索数组时会返回负数?

时间:2012-05-08 06:14:00

标签: java arrays search sorting binary

我是Java的初学者,正在学习使用数组。据我所知,当使用Array的二进制搜索方法时,如果找不到该条目,它将返回一个负数。但是,在下面的代码中,我得到了一个9,10和11的负数。

我想知道是否有人可以帮助指出我做错了什么?谢谢!

   String [] oneToSixteen = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"};

   System.out.println("Searching for 7: "+ Arrays.binarySearch(oneToSixteen, "7"));
   System.out.println("Searching for 8: "+ Arrays.binarySearch(oneToSixteen, "8"));
   System.out.println("Searching for 9: "+ Arrays.binarySearch(oneToSixteen, "9"));
   System.out.println("Searching for 10: "+ Arrays.binarySearch(oneToSixteen, "10"));
   System.out.println("Searching for 11: "+ Arrays.binarySearch(oneToSixteen, "11"));

我得到的输出是:

Searching for 7: 6
Searching for 8: 7
Searching for 9: -17
Searching for 10: -2
Searching for 11: -2

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:9)

这是因为您的数组是一个String而不是int未排序的数组。

文档明确指出必须对要搜索的数组进行排序,如果不是,则结果未定义。

要对数组进行排序,您可以使用Arrays类的sort method

答案 1 :(得分:0)

否定引用组件-1,其中String将被发现/插入到您的数组中,并且因为您的数组未被排序而出现。找不到该元素。 所以对你的阵列 “9”是-17它将被插入到组件16中 “10”将插入组件1中 “11”将插入组件1

数组类型无关紧要,因为Arrays方法已经过载。

按使用

排序
Arrays.sort(oneToSixteen);

然后使用你的binarySearch()

答案 2 :(得分:0)

请注意,要使Array.binarySearch(array, key)方法正常工作,必须先对源数组进行排序。如果未对源数组进行排序,则结果将是未定义的。根据您的问题,源数组未排序。要按自然顺序对数组进行排序,请使用util方法Arrays.sort(array)。您还可以提供额外的比较器来控制排序顺序Arrays.sort(array, comparator)

示例:

// sort in natural order (ascending)
Arrays.sort(oneToSixteen);

// sort descending using comparator
Arrays.sort(oneToSixteen, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o2.compareTo(o1);
    }
});