【问题标题】:ArrayList BinarySearchArrayList BinarySearch
【发布时间】:2011-01-20 00:08:53
【问题描述】:

我正忙于准备 MCTS 70-536 考试,根据考试书(Microsoft Press - .NET Framework - Application Development Foundation Self Paced Training Kit 2nd Edition),此代码示例:

ArrayList al = new ArrayList();
al.AddRange(new string[] { "Hello", "world", "this", "is", "a", "test" });
Console.WriteLine(al.BinarySearch("this"));

将值“2”输出到控制台,因为项目“this”位于索引 2。同意这是我运行该代码时得到的输出。

但是如果我跑了

Console.WriteLine(al.BinarySearch("world"));

我希望在控制台中获得值 1,因为“世界”的索引为 1,但是我得到的值是 -7?

谁能解释一下这是如何工作的?

谢谢

【问题讨论】:

    标签: c# collections arraylist


    【解决方案1】:

    您正在对其执行二进制搜索的数组未排序。这是BinarySearch 运行的必要条件。

    未排序,混淆搜索算法,使其认为“世界”应该在第7位,但它不在数组中:结果为-7。

    【讨论】:

    • 感谢这给了我更好的结果。我对书中的错误感到非常惊讶。让 .BinarySearch(s) 和 .IndexOf(s) 方法做同样的事情听起来有点奇怪。
    【解决方案2】:

    直接取自 ArrayList.BinarySearch (http://msdn.microsoft.com/en-us/library/5tzt7yz3%28VS.85%29.aspx) 的 MSDN 文档

    value参数和每个元素 的 ArrayList 必须实现 IComparable 接口,使用的 进行比较。的元素 ArrayList 必须已经排序 根据排序增加值 由 IComparable 定义的顺序 执行;否则,结果 可能不正确。

    【讨论】:

      【解决方案3】:

      问题已回答,但添加此内容以供参考。

      BinarySearch 将使用排序算法查找项目。在您的示例中,默认排序是按字母顺序排列的,因此“世界”应该排在最后,因此编号为 7。

      您将看到 BinarySearch 的一个重载器,它接受一个 IComparer 对象。不提供这个会给出默认的字母排序。

      但是,如果您按照书中的建议实现了“reverseSort”方法,那么您需要将“reverseSort”对象传递给 BinarySearch 函数。

      像这样;

      Console.WriteLine(al.BinarySearch(al, new reverseSort()));
      

      正如我发现如果你实现“reverseSort”类并执行一个console.writeline 来比较值的结果非常有趣,结果不是我所期望的。我花了一点时间试图弄清楚算法是什么。

      【讨论】:

        【解决方案4】:

        来自documentation

        从零开始的价值索引 已排序的 ArrayList,如果找到值; 否则为负数,即 的索引的按位补码 下一个大于的元素 值,或者,如果没有更大的 元素,按位补码 计数。

        注意sorted这个词。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 2014-06-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多