如何使用c#计算字符串数组中的单词出现次数?

时间:2012-11-14 05:09:46

标签: c#

我是编程的新手,我正在尝试编写一个接受字符串数组的程序(数组的每个索引都是一个单词),然后计算字符串中每个单词的出现次数。这就是我到目前为止所做的:

        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

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

当然有更有效的方法来处理这个问题(看看dasblinkenlight对一个非常好的答案的答案)但是假设你想要保持相对相同的代码,你应该将你的第二个for循环更改为沿着这些行的东西:

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

以下是我所做的两项更改:

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

2)为了提高效率,如果两个字符串不相等,你会想要跳出第二个循环;因为你按字母顺序对数组进行排序,如果你当前正在查看的单词不相等,那么它之后的单词都不是。

答案 2 :(得分: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);
        }
    } 

这不会再次打印相同的值。

答案 3 :(得分: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);

答案 4 :(得分: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);
        }