2013-11-24 3 views
0

В настоящее время я пытаюсь создать небольшую программу, если пользователь вводит строку в текстовой области, нажимает на кнопку, и программа подсчитывает частоту разных символов в строке и показывает результат в другой текстовой области. . Шаг 1: - Пользователь введите: - aaabbbbbbcccdd Шаг 2: - Пользователь нажмите кнопку Шаг 3: - 3 б 6 с 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++); 
       } 
      } 

     } 
    } 
} 

Любые идеи или помощь, как я могу рассчитывать, потому что до сих пор программа дает ошибку времени выполнения, когда есть один и тот же 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 принимает два аргумента string и int .... – user2307236

+0

@ user2307236: Да, вы правы. Значение должно быть строкой везде, где оно используется со словарем. Я обновил код выше. – Guffa

0

Я собираюсь предложить другой и несколько более простой подход к делать это. Предполагая, что вы используете английские строки, вы можете создать массив с емкостью = 26. Тогда в зависимости от персонажа, с которым вы сталкиваетесь, вы увеличиваете соответствующий индекс в массиве. Например, если символ «а» приращение счетчика с индексом 0, если символ «б» увеличивает счетчик с индексом 1, и т.д. ...

Ваша реализация будет выглядеть примерно так:

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

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

Когда это закончится, у вас будет число «a» в count [0] и количество «z» в счете [25].

+0

Я не могу понять эту часть кода ..... - int ('a')] ++, а также {0} вы можете любезно объяснить .... – user2307236

+0

{0} инициализирует все элементы в вашем массиве count до 0. int ('a') в основном возвращает ascii код для символа a, который на самом деле равен 97. Таким образом, если вы встретите «b», мы будем увеличивать индекс 98-97 = 1! 98 здесь есть ascii 'b' и т. Д. Буква 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» группы, которое является символом. Если вы используете 'GroupBy', это гарантирует, что вы не получите дубликатов. Значение представляет собой 'IEnumerable ' того же символа. Метод «Enumerable.Count» перечисляет эти символы, чтобы получить общее количество каждой группы. –

Смежные вопросы