2013-11-24 73 views
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++); 
       } 
      } 

     } 
    } 
} 

任何想法或帮助我如何countinue,因为直到现在该程序给出了运行时错误,当有同样的charachter!

谢谢

回答

0

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

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

而不是使用一个变量count的,你会想增加数的字典,并初始化新项目有一个计数:

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

我试过上面的,但是编译器给出的错误是我有无效的参数...我猜这个问题是因为dic需要两个参数一个字符串和int .... – user2307236

+0

@ user2307236:是的,你说得对。该值必须是与字典一起使用的任何字符串。我更新了上面的代码。 – Guffa

0

我会建议这样做不同的,有点简单的方法。假设你正在使用英文字符串,你可以创建一个容量= 26的数组。然后根据你遇到的字符,你会增加数组中相应的索引。例如,如果字符是“A”增量次数为指数0,如果字符是“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's数和计数[25]中的z数。

+0

我无法理解这部分代码..... - int('a')] ++和{0},你可以好好解释一下...... – user2307236

+0

{0}初始化count数组中的所有元素为0. int('a')基本上返回ascii代码字符a实际上是97.所以如果你遇到'b',我们将增加索引98-97 = 1!这里是'b'的ascii等等。字母z有ascii 122,将被放置在索引122-97 = 25。 – Pepe

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

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

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

我已经使用linq查询,它工作正常...因为我是初学者,你可以在几行代码中解释发生了什么。Tks – user2307236

+0

@ user2307236:它甚至只有一行。 ['Enumerable.GroupBy'](http://msdn.microsoft.com/en-us/library/bb534501(v = vs.110).aspx)按字符串的值对字符串中的每个字符进行分组,“ToDictionary”创建一个字典由提供的密钥和值。关键是组的“Key”属性,它是char。如果你使用'GroupBy',它确保你没有重复。值是相同字符的IEnumerable 。 'Enumerable.Count'方法枚举这些字符以获得每个组的总数。 –