2013-11-24 2 views
0

현재 사용자가 텍스트 영역에 문자열을 입력하고 단추를 클릭하고 프로그램에서 문자열의 다른 문자 빈도를 계산하면 작은 프로그램을 만들려고합니다. 다른 텍스트 영역에 결과를 표시합니다. 예. 1 단계 : - 사용자 입력 : - aaabbbbbbcccdd 2 단계 : - 사용자 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++); 
       } 
      } 

     } 
    } 
} 

동일한 문자가있을 때 프로그램에서 런타임 오류가 발생하기 때문에 어떤 아이디어 나 도움이 필요합니까?

고맙습니다.

답변

0

: 그러나, 나는이 작은 LINQ 쿼리를 사용합니다. 사전이 문자열과 결코 같지 않으므로 코드는 항상 이미 존재하는 경우에도 새 항목을 추가해야한다고 생각하므로 런타임 오류의 원인이됩니다.

문자열이 사전에 키로 존재하는지 확인하려면 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

나는 이것을하기위한 다소 다른 방법을 제안하고자합니다. 영어 문자열을 사용 중이라고 가정하면 capacity = 26 인 배열을 만들 수 있습니다. 발생하는 문자에 따라 배열에서 적절한 색인을 증가시킵니다.

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

for(int i = 0; i < s.length; i++) 
{ 
    count[Char.ToLower(s[i]) - int('a')]++; 
} 
: 캐릭터 '는'증가 수가 인덱스 0에있는 경우 문자 인 경우 예를 들어, 'B'는

귀하의 구현은 다음과 같이 보일 것 ... 등 인덱스 1에서 수를 증가

이 작업이 끝나면 'a의 수는 [0]이고'z의 수는 [25]입니다.

+0

나는 코드의이 부분을 이해할 수 없다 ..... - int ('a')] ++ 또한 {0} 당신이 친절하게 설명 할 수 있습니다 .... – user2307236

+0

{0}은 카운트 배열의 모든 원소를 0으로 초기화합니다. int ('a')는 기본적으로 ascii 문자 a의 코드는 실제로 97입니다. 따라서 'b'를 만나면 색인 98-97 = 1을 증가시킵니다! 여기서 98은 '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.ContainsKey을 사용하십시오. 당신은 문자열에 해당하는 사전에서 키가있는 경우를 알려하지 않는 문자열로 전체 사전을 비교하려고

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'는 사전에 제공된 키와 값으로 키는 char 인 그룹의'Key' 속성입니다. 'GroupBy'를 사용하면 복제본을 얻을 수 없습니다. 값은 동일한 문자의 IEnumerable 입니다. Enumerable.Count 메소드는 각 그룹의 총수를 얻기 위해이 문자들을 열거한다. –

관련 문제