我对 C# 很陌生。我创建了一个 List 对象,然后对特定项目执行 BinarySearch。但搜索结果似乎很奇怪。这是代码:
class Element
{
public int x;
public Element(int val) { x = val; }
}
class MyContainer : IComparable<MyContainer>
{
public Element elem;
public MyContainer(int val) { elem = new Element(val); }
public MyContainer(Element e) { elem = e; }
public int CompareTo(MyContainer obj)
{
if (elem.x < obj.elem.x) { return -1; }
else if (elem.x == obj.elem.x) { return 0; }
else { return 1; }
}
}
class Program
{
static void Main(string[] args)
{
MyContainer container1 = new MyContainer(100);
MyContainer container2 = new MyContainer(21);
MyContainer container3 = new MyContainer(-122);
Element elemObj = new Element(-122);
List<MyContainer> list = new List<MyContainer>();
list.Add(new MyContainer(80));
list.Add(container1);
list.Add(container2);
list.Add(container3);
list.Add(new MyContainer(90));
foreach(MyContainer c in list) Console.WriteLine(c.elem.x);
if (list.Contains(container3) == true) Console.WriteLine("present");
else Console.WriteLine("NOT present");
Console.WriteLine("Search result:::"+list.BinarySearch(new MyContainer(elemObj)));
Console.WriteLine("Search result:::" + list.BinarySearch(container1));
Console.WriteLine("Search result:::" + list.BinarySearch(container2));
Console.WriteLine("Search result:::" + list.BinarySearch(container3));
}
}
输出如下:
80
100
21
-122
90
present
Search result:::-1
Search result:::-6
Search result:::2
Search result:::-1
为什么只找到了值21对应的元素,而其他的没有找到
您的列表一开始就没有排序。二分查找only当原始输入已排序时起作用。重点是你知道如果list[x] = y
, then list[a] <= y
对全部a < x
and list[a] >= y
对全部a > x
.
因此,要么您需要首先对列表进行排序,要么需要选择不同的搜索方式(例如,使用单独的基于哈希的字典,或者仅进行线性搜索)。
另请注意,您的CompareTo
方法可以更简单地实现:
public int CompareTo(MyContainer obj)
{
return elem.x.CompareTo(obj.elem.x);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)