计算字符串中不同字符的频率数

时间:2013-11-24 21:15:56

标签: c#-4.0

我目前尝试创建一个小程序,用户在文本区域输入一个字符串,单击一个按钮,程序计算字符串中不同字符的频率,并在另一个文本区域显示结果。 例如。第1步: - 用户输入: - aaabbbbbbcccdd      第2步: - 用户单击按钮      第3步: - 3               b 6               c 3               d 1 这就是我到目前为止所做的......

    public partial class Form1 : Form
    {
        Dictionary<string, int> dic = new Dictionary<string, int>();
        string s = "";
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            s = textBox1.Text;
            int count = 0;
            for (int i = 0; i < s.Length; i++ )
            {
                textBox2.Text = Convert.ToString(s[i]);
                if (dic.Equals(s[i]))
                {
                    count++;
                }
                else
                {
                    dic.Add(Convert.ToString(s[i]), count++);
                }
            }

        }
    }
}

任何想法或帮助我如何计算,因为到目前为止,当有相同的字符时,程序会出现运行时错误!!

谢谢

4 个答案:

答案 0 :(得分:1)

var lettersAndCounts = s.GroupBy(c=>c).Select(group => new { 
                             Letter= group.Key, 
                             Count = group.Count() 
                        });

答案 1 :(得分:1)

而不是dic.Equals使用dic.ContainsKey。但是,我会使用这个小linq查询:

Dictionary<string, int> dict = textBox1.Text
    .GroupBy(c => c)
    .ToDictionary(g => g.Key.ToString(), g => g.Count());

答案 2 :(得分:0)

我将建议采用另一种更简单的方法来做到这一点。假设您正在使用英语字符串,则可以创建容量= 26的数组。然后,根据您遇到的字符,您将增加数组中的相应索引。例如,如果字符在索引0处为'a'增量计数,则如果字符为'b',则在索引1处增加计数等等...

您的实现将如下所示:

int count[] = new int [26] {0};

for(int i = 0; i < s.length; i++)
{
   count[Char.ToLower(s[i]) - int('a')]++;
}

完成此操作后,您将获得计数[0]中的'a'和计数[25]中的'z'的数量。

答案 3 :(得分:0)

您正在尝试将整个字典与字符串进行比较,该字符串不会告诉您字典中是否存在与字符串对应的键。由于字典永远不等于字符串,因此您的代码将始终认为它应该添加一个新项目,即使已存在,也是运行时错误的原因。

使用ContainsKey方法检查字符串是否作为字典中的键存在。

您可能希望增加字典中的数字,而不是使用变量count,并初始化一个计数为1的新项目:

string key = s[i].ToString();
textBox2.Text = key;
if (dic.ContainsKey(key)) {
  dic[key]++;
} else {
  dic.Add(key, 1);
}