2013-09-27 31 views
-4

当找不到结果时,我得到一个奇怪的输出。结果未找到时奇怪的输出为二进制搜索

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权证一-6

为什么它打印-2当我通过 “Y” 作为我的查询参数和-5当我通过b任何人都可以让我知道发生了什么,如果没有找到结果。

+0

您是否阅读过binarySearch的Javadoc?它通常有帮助。 –

回答

10

我不太了解Java,但Google给了我this link

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

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

+2

感谢您的第二段... – Shane

4

Arrays#binarySearch()返回要搜索的元素的索引,或者如果没有找到,则返回(-index - 1)其中index是其中元素将排序后的数组中插入的位置。

从文档:

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

,用你的数组排序,"b"将在index = 1插入,"a"之后。因此返回值是(-1 - 1) = -2