【问题标题】:Counting sort used on alphanumerical data?用于字母数字数据的计数排序?
【发布时间】:2016-08-27 19:59:03
【问题描述】:

我必须为我的项目使用计数排序对字母数字数据库进行排序,而我的代码不断给我错误。我有一个 txt 文件,其中存储了字母数字值,例如是 86K4G9F8124。 (txt文件中有10000个随机的)。这是我在 Visual Studio 中的代码(它在 C# 中)并给我一个错误:while (counts[i].CompareTo(f) > 0)。

这里是:

{
    ArrayList Data = new ArrayList();
    Stopwatch SW = new Stopwatch();
    StreamWriter SWr = new StreamWriter("Time.txt");
    int j = 100;

    while (j != 10000)
    {
        ReadData(ref Data, j);
        SW.Start();
        CountingSort(Data);
        SW.Stop();
        SWr.WriteLine("{0} {1}", j, SW.ElapsedTicks);
        Console.WriteLine(j);
        SW.Reset();
        j = j + 100;
        Data.Clear();
    }
    SWr.Close();
}

static void CountingSort(ArrayList Data)
{
    // O(1)
    string max, b;
    max = (string)Data[0];

    // O(N)
    for (int i = 0; i < Data.Count; i++)
    {
        b = (string)Data[i];
        if (b.CompareTo(max) > 0)
        {
            max = b;
        }
    }

    // Space complexity O(N+K)
    string counts = (string)Data[0];
    string output =(string)Data[Data.Count - 1];

    string c;
    // O(N)
    for (int i = 0; i < Data.Count; i++)
    {
        c = (string)Data[i];
        counts = c;
    }

    string d;
    string e;
    string f = " ";
    // O(N+K)
    for (int i = 0; i < counts.Length; i++)
    {
        while (counts[i].CompareTo(f) > 0)
        {
            d = (string)Data[i];
            output= d;
            e = (string)Data[i--];
            counts = e;
        }
    }
}

static void ReadData(ref ArrayList data, int Times)
{
    StreamReader SR = new StreamReader("Data.txt");
    for (int i = 0; i < Times; i++)
    {
        data.Add(SR.ReadLine());
    }
    SR.Close();
}

请有人帮助我,告诉我哪里出错了,希望能做什么。谢谢!

【问题讨论】:

  • 它给出的错误是什么? counts 是一个字符串,当您对它进行索引时,您会返回该索引处的字符,因此很可能错误是您正在比较不兼容的类型。 C# 是静态类型的,f 是字符串,counts 是字符串,counts[i] 是 char,char == string 在 C# 中是不允许的,因为它有严格的类型系统。
  • @evanmcdonnal 错误说:mscorlib.dll 中发生了“System.ArgumentException”类型的未处理异常我明白你的意思,但是我怎样才能对字母数字数据进行排序计数呢?谢谢
  • 你得到一个参数异常,因为你正在调用这个方法; msdn.microsoft.com/en-us/library/bhh2bx3h(v=vs.110).aspx (或接受和 object 作为参数的其他版本)但将其传递给字符串。如果您使用相等运算符 (==),那么您会收到编译器错误,但由于该方法有一个重载接受类型 object,它会尝试调用该方法,然后当它意识到它无法将字符串与字符进行比较时抛出。我将发布一个带有微小更改的答案,至少可以解决该问题,但您的逻辑中可能仍有其他问题。

标签: c# visual-studio sorting while-loop counting


【解决方案1】:

你得到一个System.ArgumentException,因为你将错误的类型传递给CompareTo。在下面的代码中,counts[i] 正在对字符串进行索引,这意味着您实际调用的 CompareTocharCompareTo 有很多版本(实际上不止一个用于字符和字符串)。虽然这可能无法完全解决您程序中的问题(我还没有测试过它以某种方式表示),但只需将 f 的类型从 string 更改为 char 即可解决您当前面临的问题.

char f = ' ';
// O(N+K)
for (int i = 0; i < counts.Length; i++)
{
    while (counts[i].CompareTo(f) > 0)
    {
        d = (string)Data[i];
        output= d;
        e = (string)Data[i--];
        counts = e;
    }
}

如果您在此处 (https://msdn.microsoft.com/en-us/library/he5tb5hy(v=vs.110).aspx) 阅读有关 CompareTo 的评论,您会发现此行为已记录在案。您的代码可以编译,因为有一个重载 CompareTo 接受和 object 作为它的参数,并且 string 继承自 object 所以这个方法调用是允许的,但是,如果传递给它的 object 不是nullchar 类型的实例然后它会抛出一个 ArgumentException 所以基本上,只需检查您的代码并确保您将字符与字符和字符串与字符串进行比较,您应该很高兴,裸露实际排序逻辑中的任何错误。

【讨论】:

    【解决方案2】:

    问题在于countsstring,而不是string 的数组或列表。
    我不太了解代码,但尝试匹配类型(也许用Data 替换counts?同样,不太了解,但似乎合适)

    【讨论】:

    • 你是说我必须计算一个数组列表而不是一个字符串?
    • 对不起,但根据我对计数排序的了解(现在在 Wikipedia 上阅读五分钟),字符串根本不可能......我不明白这段代码的作用......
    猜你喜欢
    • 2020-09-26
    • 2017-06-05
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2018-04-12
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多