3

我是 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

任何帮助将非常感激。

4

3 回答 3

9

这是因为您的数组是一个数组String而不是int并且它没有排序

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

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

于 2012-05-08T06:15:16.237 回答
0

负数是指将在您的数组中找到/插入字符串的组件1,并且由于您的数组未排序而出现。未找到该元素。因此,对于您的数组“9”为-17,它将被插入到组件 16 “10”将被插入到组件 1 “11”将被插入到组件 1

Array 的类型无关紧要,因为 Arrays 方法已被重载。

按使用排序

Arrays.sort(oneToSixteen);

然后使用您的 binarySearch()

于 2012-05-20T09:22:52.043 回答
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);
    }
});
于 2012-05-21T07:16:55.663 回答