2012-05-07 22 views
2

確定這裏的傢伙是我的一段簡單的代碼,我在那裏建立一個字符串數組,並試圖尋找這個數組中的字符串:的Java數組的binarySearch

String[] arr = new String[5]; 
arr[0] = "ccc"; 
arr[1] = "aaa"; 
arr[2] = "bbb"; 
arr[3] = "eee"; 
arr[4] = "ddd"; 

System.out.println(Arrays.binarySearch(arr,"eee")); 

直接從Java 6的binarySearch文檔摘自:「數組必須在進行此調用之前進行排序,如果未排序,則結果未定義「!

其實我運行我的代碼幾次得到輸出總是3這是我的排序數組中的eee的位置,但結果似乎不是「文檔說的未定義」。

我錯過了什麼?

感謝

回答

3

「未定義」表示該算法將在您的數組上運行,但結果無法保證正確(二進制搜索強烈需要有序數組才能工作)。你的榜樣工作,因爲這是發生了什麼:

  • 進入二進制搜索與第一= 0,最後= 4,中間= 2的比較
  • 陣列[中]與 「EEE」( 「BBB」 < 「EEE」 )=> first = 2 + 1;中間= 3;
  • 將數組[中]與「eee」=>「找到」進行比較;返回3;
4

你缺少一個「結果是不確定的」包括「正確」答案的可能性,因爲在這種情況下。

如果將arr [1]更改爲「eee」,則會看到不同的結果。

8

「未定義」並不意味着「肯定會給你錯誤的結果」,或者「肯定會崩潰」。

+1

相反,它的意思是「可能是任何東西,我們沒有指定它是什麼」。星期二可能會有所不同,或者外面陽光充足,或者您的母親今天感覺如何:沒有指定。 –

4

由許多研究機構,書籍,教授等定義的二進制搜索。要求按字母或數字方式對元素進行排序。

import java.util.Arrays; 

public class Main { 
    public static void main(String[] args) { 
    String[] arr = new String[6]; 
    arr[0] = "ccc"; 
    arr[1] = "aaa"; 
    arr[2] = "bbb"; 
    arr[3] = "eee"; 
    arr[4] = "ddd"; 
    arr[5] = "aaa"; 
    System.out.println(Arrays.toString(arr)); 
    System.out.println("\"eee\" was found at index: " + Arrays.binarySearch(arr, "eee")); 
    Arrays.sort(arr); 
    System.out.println(Arrays.toString(arr)); 
    System.out.println("\"eee\" was found at index: " + Arrays.binarySearch(arr, "eee")); 
    } 
} 
1

添加到esej的答案,這裏是你的程序的修改,它返回錯誤的答案:

public class Main { 
    public static void main(String[] args) { 
     String[] arr = new String[6]; 
     arr[0] = "ccc"; 
     arr[1] = "aaa"; 
     arr[2] = "bbb"; 
     arr[3] = "eee"; 
     arr[4] = "ddd"; 
     arr[5] = "aaa"; 

     System.out.println(Arrays.binarySearch(arr, "eee")); 
    } 
} 
+1

換句話說,數組大小從5變爲6。 – Nayuki

5

當我們談論的一段代碼將如何表現,術語「未定義」是指執行程序可以做這些事情:

  • 返回錯誤的答案
  • 永遠循環下去
  • 立即崩潰
  • 損壞一些數據並導致崩潰太晚
  • 做一些其他意外的事情(例如,抹掉硬盤驅動器)
  • 是幸運的,並返回正確的答案

提供的建議程序員,不發生未定義行爲,因爲任何事情都有可能發生,或好或壞的,現在或以後。