【问题标题】:BinarySearch on List<T> seems to be returning strange resultList<T> 上的 BinarySearch 似乎返回了奇怪的结果
【发布时间】:2014-03-08 04:54:20
【问题描述】:

我对 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 对应的元素,为什么没有找到其他元素

【问题讨论】:

    标签: c# collections binary-search


    【解决方案1】:

    您的列表一开始没有排序。二进制搜索在对原始输入进行排序时起作用。关键是你知道如果list[x] = y,那么list[a] &lt;= y 代表所有a &lt; xlist[a] &gt;= y 代表所有a &gt; x

    因此,您要么需要先对列表进行排序,要么需要选择不同的搜索方式(例如,使用单独的基于散列的字典,或者只进行线性搜索)。

    还请注意,您的 CompareTo 方法可以更简单地实现:

    public int CompareTo(MyContainer obj)
    {
        return elem.x.CompareTo(obj.elem.x);
    }
    

    【讨论】:

      【解决方案2】:

      BinarySearch 仅适用于排序列表。由于您的列表未按应有的方式排序,因此它可能会也可能不会正确找到结果。你可以先通过sorting 解决这个问题:

      list.Add(new MyContainer(90));
      // after adding all elements
      list.Sort();
      foreach(MyContainer c in list)  Console.WriteLine(c.elem.x);
      

      【讨论】:

      • 哦!谢谢你的回复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多