【问题标题】:In Java why does this return a negative number when searching the array with binary search?在Java中,为什么在使用二进制搜索搜索数组时返回负数?
【发布时间】:2026-01-30 12:55:01
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • 字符串数组未排序(此时binarySearch的返回值未定义)。

标签: java arrays search sorting binary


【解决方案1】:

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

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

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

【讨论】:

  • “未排序”这一点是公平的 - 但您对 数组类型 发表评论的原因是什么?他搜索的是String,而StringComparable
  • @11684: Arrays.sort 可以解决问题……当然这会改变所有结果。
  • @GregKopff:我怀疑重点是它们没有排序因为它们是字符串(根据字典顺序进行比较);相同的值 作为整数 显然已经正确排序了。
  • @11684: 没错——这就是这些字符串的字典顺序。
  • @GregKopff:如果它是 int 数组,那么 1,2,3,4,..12 将被隐式排序.. nto 为 String。对于字符串,排序是使用 ascii 值。
【解决方案2】:

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

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

使用排序

Arrays.sort(oneToSixteen);

然后使用您的 binarySearch()

【讨论】:

    【解决方案3】:

    请记住,要使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);
        }
    });
    

    【讨论】: