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