您好我的库需要一些帮助。我正在尝试从我的List<>
实现二进制搜索,但它的工作效果不佳。
这是我的图书馆课程。
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;
}
}
}
}
}
如果我有更好的方法可以制作搜索方法,我将不胜感激,谢谢。
答案 0 :(得分:3)
如果不对您的算法的详细信息发表评论,您的代码就会出现一些问题。您可以通过查看编译器的错误消息找到所有这些问题。
您返回true
和false
,但您的方法指定它返回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);