2016-05-02 34 views
1

プロジェクトのカウントソートを使用して英数字データベースをソートする必要があります。私は英数字の値が格納されたtxtファイルを持っています。 86K4G9F8124です。 (txtファイルには10000個のランダムなものがあります)。これはビジュアルスタジオ(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(); 
} 

誰かが私を助けることができるしてくださいと私は何をすべきか間違って、うまくいけばつもりだところを教えてください。ありがとう!

+0

エラーは何ですか? 'counts'は文字列です。インデックスを付けると、そのインデックスの文字が返されるため、互換性のない型を比較している可能性があります。 C#は静的に型付けされ、fは文字列、countsは文字列、counts [i]はchar型、厳密な型システムを持つため、 'char == string'はC#では使用できません。 – evanmcdonnal

+0

@evanmcdonnalエラー:mscorlib.dllで 'System.ArgumentException'の未処理の例外が発生しました 何を意味するのか分かりますが、英数字データのソートカウントはどうすればできますか?ありがとう –

+0

このメソッドを呼び出しているので、引数の例外が発生しています。 https://msdn.microsoft.com/en-us/library/bhh2bx3h(v=vs.110).aspx(または引数として 'object'を受け入れる他のバージョン)ではなく、文字列を渡します。等価演算子( '==')を使用した場合、コンパイラエラーが発生しますが、メソッドがオブジェクト型を受け入れるオーバーロードを持っているため、そのメソッドを呼び出そうとします。私はその問題を少なくとも修正するマイナーチェンジで回答を投稿しますが、あなたのロジックにはまだ他の問題があるかもしれません。 – evanmcdonnal

答えて

0

countsstringであり、stringの配列またはリストではありません。
私は(再び、多くを理解したが、適切と思わなかった?たぶんDatacountsを置き換える)コードの多くを理解したが、種類が一致しようとしなかった

+0

あなたは文字列の代わりに数え上げる必要があると言っていますか? –

+0

申し訳ありませんが、ソートをカウントすることについて知っているもの(Wikipediaで5分前に読んでください)は文字列では不可能です...私はこのコードが何をするのか分かりません... – Neo

1

あなたが渡しているので、あなたはSystem.ArgumentExceptionを取得しています間違ったタイプのCompareTo下のコードでは、counts[i]が文字列にインデックスを付けています。つまり、実際にCompareToと呼んでいるものはcharです。 CompareToの多くのバージョンがあります(実際には文字と文字列の両方に複数のバージョンがあります)。これはあなたのプログラムの問題を完全には解決しないかもしれませんが(私はそれをテストしていません)、stringからcharへのタイプをfに変更するだけで、現在直面している問題を解決できます。

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; 
    } 
} 

あなたがここにCompareTohttps://msdn.microsoft.com/en-us/library/he5tb5hy(v=vs.110).aspx)の発言を読んでいる場合は、この動作が文書化されています。あなたのコードは、このメソッドの呼び出しは、しかし、許可され、それに渡さobjectnullまたはタイプcharのインスタンスではない場合、それは投げ、それは引数だとして受け入れ、objectCompareToのオーバーロードがありますので、コンパイル、およびobjectからstring継承ArgumentExceptionだから、基本的には、あなたのコードを調べて、文字を文字列と文字列に比較していることを確認してください。実際のソートロジックでエラーが発生しないようにしてください。

関連する問題