搜索没有内置方法的字符串数组

时间:2015-04-21 00:22:39

标签: c# arrays string search binary-search

如果有人可以提供帮助,我将非常感激。

基本上我正在做一个家庭作业项目,其中一部分,我需要搜索一个数组。数组,我目前有一个String类型,但实质上是日期的集合。 (格式为05/06/2014)

我只是在试图找到一种允许用户搜索此数组的方法,特别是那些不使用像array.binarysearch等内置方法的方法。

我试图实现二进制搜索,但似乎没有用,如果你想看看我可能出错的地方,我可以提供代码。但是,对于这种字符串类型,我应该使用更好的搜索,还是应该将字符串数组转换为其他类型?

如果有人可以提供帮助我会非常感激,我不一定要求任何人为我做我的工作如果有人能让我朝着正确的方向努力,我会感到激动,因为这个问题一直在做我的坚果in。谢谢!

当前二进制搜索代码:

public static void BinarySearch(string[] dateArray, string searchTerm)
{
    int first = 0;
    int last = dateArray.Length - 1;
    int position = -1;
    bool found = false;
    int compCount = 0;


    while (found != true && first <= last)
    {
        int middle = (first + last) / 2;

        int comparisonSTR = string.Compare(dateArray[middle], searchTerm);

        if (dateArray[middle] == searchTerm)
        {
            found = true;
            position = middle;
            compCount++;

            Console.WriteLine("Your search has been found after " + compCount + "comparisons.");
        }

        else if (comparisonSTR > 0)
        {
            last = middle;
            compCount++;
        }

        else
        {
            first = middle;
            compCount++;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

对于教育回复,你的二进制搜索是正确的*,如果不是很干净 - 就像@Alex说的那样,你只需要确保你将它们作为DateTimes进行比较。问题在于

int comparisonSTR = string.Compare(dateArray[middle], searchTerm);

因为&#34;字符串类&#34;我不知道日期是什么,因此当您尝试搜索日期时,它无法真正为您提供日期时间比较。它只能比较一个术语是在字母之前,相等还是在另一个术语之后进行比较。

相反,如果将它们转换为DateTimes并使用特定于DateTimes的比较器,那么您应该返回可用于二进制搜索的比较。您可以将它们转换为DateTime in-line

int comparisonSTR = DateTime.Compare(Convert.ToDateTime(searchTerm), Convert.ToDateTime(dateArray[middle]));

或将它们转换为循环外部,这是您在方法中做的第一件事,以使其更容易阅读

DateTime[] dates = Array.ConvertAll(dateArray, Convert.ToDateTime);
DateTime searchDate = Convert.ToDateTime(searchTerm);

while (found != true && first <= last)
{
     int middle = (first + last) / 2;
     int comparison = DateTime.Compare(searchDate, dates[middle]);

除此之外,你几乎已经确定了。您现在可能已经解决了这个问题,所以在这种情况下,我只是将其部分发布,以解释为什么string.Compare在这种情况下无法转换日期。

编辑:确保测试您的边缘情况(例如,不仅搜索中间,而且还搜索不同数组大小的第一个和最后一个元素),因为我怀疑您的二分搜索在第二次审核时可能不完全正确。