所以我正在尝试学习和练习二进制搜索,但遗憾的是无法理解二进制搜索如何用于对象列表或仅用于字符串。处理数字时看起来并不复杂。但是你如何实际执行二进制搜索,例如对象列表,其中包含属性名称作为字符串值。
答案 0 :(得分:1)
二进制搜索假设已排序的集合。因此,您必须提供compare(a,b)
功能。作为比较结果,该函数将返回-1,0或1。数字或字符的函数实现是微不足道的。但是,您可以实现一个更复杂的逻辑,将一个或多个对象属性考虑在内。只要您提供该功能,就可以对任何对象集合进行排序,并且可以对该集合应用二进制搜索。
答案 1 :(得分:0)
您将以与数字相同的方式执行此操作,唯一的区别是,您访问正在查看的实例的属性。
例如items[x].Value
代替items[x]
。
答案 2 :(得分:0)
假设您有一个使用Friend Class的朋友列表,并且您想使用二进制搜索来查找此列表中是否存在朋友。首先,二进制搜索仅应在排序列表上进行。使用lambda,您可以排序列表,然后将其更改为数组。在此示例中,我将在单击按钮然后进行二进制搜索之后从文本框(正在寻找朋友的名字)收集输入。 Friend类还必须实现IComparable。
class Friend : IComparable<Friend>
{
public string Name { get; set; }
public string Likes { get; set; }
public string Dislikes { get; set; }
public int Birthday { get; set; }
//Used for the binary search
public int CompareTo(Friend other)
{
return this.Name.CompareTo(other.Name);
}
}
class MainWindow
{
List<Friend> friends = new List<Friend>();
//other functions here populated the list
private void OnButtonClick(object sender, EventArgs e)
{
Friend[] sortedArray = friends.OrderBy(f => f.Name).ToArray();
int index = Array.BinarySearch(sortedArray, new Friend() { Name = tb_binarySearch.Text });
if (index < 0)
{
Console.WriteLine("Friend does not exist in list");
}
else
{
Console.WriteLine("Your friend exists at index {0}", index);
}
}
}
如果索引返回为负数,则该对象不存在。否则它将是对象在已排序列表中的索引。