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 的答案非常好),但假设你想保持相对相同的代码,你应该将你的第二个 for 循环更改为以下几行:

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

这是我所做的两个更改:

1)您应该将 j 初始化为 i+1;您想检查其余字符串是否等于 words[i],其余字符串将从 i+1 开始,而不是 1(除非 i=0)。

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 回答
0

利用字典数据结构。在这里,字典会将键存储为单词,将值存储为字数。插入字典中的所有单词。如果插入的词是新词,则将词键的值设置为 1 ,否则将词键值加 1。

        Dictionary<string, int> wordCount = new Dictionary<string, int>();

        // Insert a word in the dictionary if it exits, otherwise increment 
        //the count of the word

        for (int i = 0; i < words.Length; i++)
        {
            try
            {
                wordCount.Add(words[i], 1);
            }
            catch (Exception)
            {
                wordCount[words[i]] += 1;
            }
        }

        // display word and it's corresponding word count

        foreach (var item in wordCount)
        {
            Console.WriteLine ("{0}   {1}", item.Key, item.Value);
        }
于 2017-07-12T06:00:05.303 回答