2014-01-22 89 views
0

你好,我需要一些幫助,在我的圖書館。我試圖從我的List<>執行二進制搜索,但其效果不好。Binary search for List <object>

這是我的圖書館類。

private class Library 
{ 
    List<object> library = new List<object>(); 

    public void AddBook(string bookName, string bookAuthor, int bookIDNum) 
    { 
     //Add books to the library. 
     string bookEntry = bookName + " " + bookAuthor + " " + bookIDNum; 
     library.Add(bookEntry); 
     library.TrimExcess(); 
    } 

     public void SearchLibrary(string bookName) 
    { 
     //Searches the library by title 
     library.Sort(); 
     int low = 0; 
     int high = library.Count; 
     int mid = 0; 
     int steps = 0; 
     while(!bookName) 
     { 
      steps++; 
      mid = (low + high)/2; 
      if(bookName == library[mid]) 
      { 
       return true; 
      } 
      else if(bookName < library[mid]) 
      { 
       high = mid; 
      } 
      else 
      { 
       low = mid; 
      } 
      if(low > high-1 || high < low+1) 
      { 
       return false; 
      } 
     } 
    } 
} 
} 

如果有更好的方法我可以做一個搜索方法,我將不勝感激,謝謝。

+9

我只是要離開這個在這裏...:http://msdn.microsoft.com/en-us/library/w4e7fxsh(v=vs.110).aspx –

+2

請出示樣品,使感/編譯。顯然'public void SearchLibrary(){... return true; ...}'不是有效的代碼。 –

+0

您打算如何對未排序的數據進行二分搜索?爲什麼你的'List'包含'object'?爲什麼你的'void'方法試圖返回布爾值?爲什麼搜索方法不會返回匹配值的索引或匹配值本身? –

回答

3

不評論你的算法的細節,你的代碼有一些問題。您可以通過查看編譯器的錯誤消息找到所有這些問題。

  • 將返回truefalse,但是你的方法指定返回void。改爲bool

    public bool SearchLibrary(string bookName) 
    
  • 你做!bookName,要檢查它是否是null與否,我推測。你必須在C#中明確地做到這一點。

    while (bookName != null) 
    
  • 你比較兩個字符串,但<操作不超載的字符串。改爲使用CompareTo

    else if (bookName.CompareTo(library[mid]) < 0) 
    
  • 不是所有的代碼路徑都返回一個值。無論執行哪條路徑,您都必須返回一個值。例如,結束您的方法與此:

    return false; 
    

再有就是用你的算法的一個問題:它會永遠運行時不存在匹配。因爲我懷疑這可能是家庭作業,所以我會給OP做一個練習來解決這個問題。


,如果這是不是一個課外練習,你有可能會保存自己的一些麻煩:

List<T>類有一個方法BinarySearch使用默認的比較的對象列表進行比較。

library.Sort(); 
bool found = (library.BinarySearch(bookName) >= 0); 
+0

+1:詳細的寫法。注意列表搜索的當前內容將永遠不會*找到匹配,因爲'bookName'永遠不會單獨存儲在列表中(其他信息附加到它)。 –

+0

@AlexeiLevenkov在我看到的代碼中,沒有對'SearchLibrary'的調用,所以我不知道是否將正確的字符串傳遞給它。請注意,'SearchLibrary'中使用的'bookName'和'AddBook'中使用的'bookName'是不同的變量,它們之間沒有可見的關係。 – Virtlink

+0

從技術角度看,對 - 如果'bookName'不是一本書的名字,而是項目的完整價值,那麼它就可以正常工作......另外我希望變量名反映它的含義(至少有一些努力用於尋找好名字)。 –