我已经使用了这几天了,我正在尝试完成一个控制台应用程序,我们会提示输入我们自己的字符串,输出会生成每个唯一字符的列表并在之后计数它。在结果的末尾,显示一个计数,显示找到了多少个唯一字符。尽管它是否为大写,但所有内容都被翻译为小写。他们的关键是使用集合。这是我到目前为止所拥有的。我的输出在结果中显示了两个空格字符,尽管我使用了if语句来捕获它们。任何人都可以指出我忽略的一个概念吗?
using System;
using System.Text.RegularExpressions;
using System.Collections.Generic;
public class LetterCountTest
{
public static void Main(string[] args)
{
// create sorted dictionary based on user input
SortedDictionary<string, int> dictionary = CollectLetters();
// display sorted dictionary content
DisplayDictionary(dictionary);
} // end Main
// create sorted dictionary from user input
private static SortedDictionary<string, int> CollectLetters()
{
// create a new sorted dictionary
SortedDictionary<string, int> dictionary =
new SortedDictionary<string, int>();
Console.WriteLine("Enter a string: "); // prompt for user input
string input = Console.ReadLine(); // get input
// split every individual letter for the count
string[] letters = Regex.Split(input, "");
// processing input letters
foreach (var letter in letters)
{
string letterKey = letter.ToLower(); // get letter in lowercase
if (letterKey != " ") // statement to exclude whitespace count
{
// if the dictionary contains the letter
if (dictionary.ContainsKey(letterKey))
{
++dictionary[letterKey];
} // end if
else
// add new letter with a count of 1 to the dictionary
dictionary.Add(letterKey, 1);
}
} // end foreach
return dictionary;
} // end method CollectLetters
// display dictionary content
private static void DisplayDictionary<K, V>(
SortedDictionary<K, V> dictionary)
{
Console.WriteLine("\nSorted dictionary contains:\n{0,-12}{1,-12}",
"Key:", "Value:");
// generate output for each key in the sorted dictionary
// by iterating through the Keys property with a foreach statement
foreach (K key in dictionary.Keys)
Console.WriteLine("{0,-12}{1,-12}", key, dictionary[key]);
Console.WriteLine("\nsize: {0}", dictionary.Count);
Console.ReadLine();
} // end method DisplayDictionary
} // end class LetterCountTest
我的输出声明我正在使用字母表中的每个字母,但在'a'上面还有一个空格和两个实例。我不知道它来自哪里,但我的猜测是它计算空字符或回车。我使用的字符串是......
快速的棕色狐狸跳过懒狗
除了对每一个字母进行计数之外,它还计算e三次,h两次,o四次,r两次,t两次,以及u两次。
答案 0 :(得分:0)
由于string
已经是一个或多个字符,您不需要Regex.Split
,只需使用:
foreach (var letter in input)
然后将您的if
声明更改为:
foreach (var letter in input)
{
if (!char.IsWhiteSpace(letter))
{
var letterKey = letter.ToString();
if (dictionary.ContainsKey(letterKey))
{
++dictionary[letterKey];
}
else
dictionary.Add(letterKey, 1);
}
}
然后它应该排除空字符串和空格。我怀疑你在Regex.Split
之后得到一些空字符串,而你只检查空格因此你会得到意想不到的结果如果您使用chars
,则无需担心空字符串。
答案 1 :(得分:0)
您依赖Regex.Split()
行为的问题。摘自the msdn page on the method ...
如果在输入字符串的开头或结尾处找到匹配项,则在返回的数组的开头或结尾处包含空字符串。
这正是您致电Regex.Split(input, "");
时的情况。要解决此问题,您可以从代码中删除正则表达式匹配,将字典的所有实例更改为SortedDictionary<char, int>
,并使用foreach
循环来迭代输入字符串的每个字符。
foreach (char letter in input.ToLower())
{
if (!Char.IsWhiteSpace(letter))
{
//Do your stuff
}
}