2016-09-10 23 views
0

我正在做一個Java程序,用戶可以使用隨機訪問文件創建「數據庫」(.txt文件)並在那裏存儲記錄。我正在致力於實現二進制搜索,以便爲用戶提供通過ID查找記錄的選項。在Java中隨機訪問文件上實現二進制搜索

public static String binarySearch(String fileName, String id,String data_config) throws IOException 
    { 
    RandomAccessFile Din = new RandomAccessFile(fileName, "r"); 
    num_records = getNumOfRecords(data_config); 
    int Low = 0; 
    int High = num_records; 
    int Middle; 
    String MiddleId; 
    String record = "NOT_FOUND"; 
    boolean Found = false; 

    while (!Found && (High >= Low)) 
    { 
     Middle = (Low + High)/2; 

     record = getRecord(fileName,Middle,data_config); 
     MiddleId = record.substring(0,3); 
     int result = MiddleId.compareTo(id); 


     if (result == 0) // ids match 
      Found = true; 
     else if (result < 0) 

      Low = Middle + 1; 

     else 

      High = Middle -1; 

    } 
    return record; 
} 

這裏是因爲我即使沒有的binarySearch()方法進行了測試,工作正常的getRecord()方法。

public static String getRecord(String fileName, int recordNum, String data_config) throws IOException 
{ 
    RandomAccessFile Din = new RandomAccessFile(fileName, "r"); 
    num_records = getNumOfRecords(data_config); 
    String record = "NOT_FOUND"; 
    if ((recordNum >=1) && (recordNum <= num_records)) 
    { 

     Din.seek(0); // return to the top fo the file 
     Din.skipBytes(recordNum * record_size); 
     record = Din.readLine(); 
    } 

    return record; 
} 

問題是在binarySearch中使用的compareTo()方法。它總是返回-1,滿足if-else語句的第二部分。 例如,這些都是在我的文件中的一個記錄:

編號體驗已婚工資行業
0001 1無123.0 kjasdhsjhjh
技術1是123.0 asdhajshjasdhja
0003 1是124.0 ajskjkasjd
0004 1是124.0 kasjdkjsdjs
0005 1個是124.0 kajskdjaksdjkas
0006 1是123.0 kjksjdkasj

如果我要尋找的0001:

High = num_records = 5;

低= 0,因此中東= 5/2 = 3

它前進到第三記錄和它運行0003的compareTo(0001)。這個比較的結果是-1。由於它小於0,所以新的低位等於中間位置+ 1 = 3 + 1 = 4,即使它不應該也檢查第四條記錄。由於它是二進制搜索,在這種情況下,它應該檢查第二條記錄,因爲0001小於0003.

你能幫我找到我在這裏做錯了嗎?

回答