2013-09-27 38 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