2

私はプログラミングが初めてで、文字列の配列 (配列の各インデックスは単語) を受け取り、文字列内の各単語の出現回数をカウントするプログラムを作成しようとしています。これは私がこれまでに持っているものです:

        string[] words = 
        {
            "which", 
            "wristwatches", 
            "are", 
            "swiss", 
            "wristwatches"
        };

        Array.Sort (words);
        for (int i = 0; i < words.Length; i++) 
        {
            int count = 1;
            for(int j = 1; j < words.Length; j++)
            {
                if (words [i] == words [j])
                {
                    count++;
                }
            }
            Console.WriteLine ("{0}   {1}", words[i], count);
        } 

理想的には、出力を次のようにしたいと思います。

は 1

スイス 1

その1

腕時計 2

4

5 に答える 5

6

コードの問題は、(1) 二重カウントと (2) ネストされたループの最初の要素をスキップすることです。

次のような状況を無視するため、二重にカウントしますi == j。を設定したため、最初の要素をスキップしますint j = 1

最短の解決策は、次のように LINQ を使用することです。

var counts = words
    .GroupBy(w => w)
    .Select(g => new {Word = g.Key, Count = g.Count()})
    .ToList();

これで、次のように結果を印刷できます。

foreach (var p in counts) {
    Console.WriteLine("Word '{0}' found {1} times", p.Word, p.Count);
}
于 2012-11-14T05:12:52.643 に答える
1

これを処理するより効率的な方法は確かにあります (非常に優れたものについては dasblinkenlight の回答を参照してください) が、比較的同じコードを保持したい場合は、2 番目の for ループを次の行に沿ったものに変更する必要があります。

for(int j = i+1; j < words.Length; j++)
{
    if (words [i] == words [j])
    {
        count++;
    }
    else break;
}

私が行った2つの変更は次のとおりです。

1) j を i+1 に初期化する必要があります。残りの文字列のいずれかがwords[i]と等しいかどうかを確認したい場合、残りの文字列は1ではなくi + 1から始まります(i = 0でない限り)。

2) 効率のために、2 つの文字列が等しくない場合は 2 番目のループから抜け出す必要があります。配列をアルファベット順に並べ替えたので、現在見ている単語が等しくない場合、それ以降の単語も等しくなりません。

于 2012-11-14T05:19:25.077 に答える
0

ご理解の上ご利用くださいString.Compare()

  int Duplicate = words.Lenth + 1; //any value not in the range of the string array
  for (int i = 0; i < words.Length; i++) 
    {
        int count = 1;
        for(int j = 0; j < words.Length; j++)
        {
            if(i != j)  //to avoid same string comparison
            {
               if (string.Compare(words [i],words [j]) == 0)   //or else .Equals(0) 
               {
                  count++;
                  Duplicate = j;
               }
            }
        }
        if(i != Duplicate)
        {
           Console.WriteLine ("{0}   {1}", words[i], count);
        }
    } 

これにより、同じ値が再び出力されることはありません。

于 2012-11-14T05:18:40.663 に答える
0
var occrs = words.GroupBy(x => x.ToLower())
               .ToDictionary(g => g.Key, g => g.Count());
foreach(var pair in occrs)
    Console.WriteLine(pair.Key + " " +pair.Value);
于 2012-11-14T05:18:49.900 に答える