在输入中计算字符时,在输出中获取空格字符

时间:2014-04-13 17:57:40

标签: c# collections console character

我已经使用了这几天了,我正在尝试完成一个控制台应用程序,我们会提示输入我们自己的字符串,输出会生成每个唯一字符的列表并在之后计数它。在结果的末尾,显示一个计数,显示找到了多少个唯一字符。尽管它是否为大写,但所有内容都被翻译为小写。他们的关键是使用集合。这是我到目前为止所拥有的。我的输出在结果中显示了两个空格字符,尽管我使用了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两次。

2 个答案:

答案 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
    }
}