2013-10-21 52 views
1

我正在Visual C#窗體窗體應用程序中開發程序。 我需要找出文本框中的字符數,並在列表框中顯示每個字符的頻率。我有以下代碼:在Visual C#窗體窗體應用程序中字符的頻率

private void btnCheckFrequency_Click(object sender, EventArgs e) 
{ 
    lstFreqMeter.Items.Clear(); 

    string str; 
    int c = 1; 
    int strlen; 

    str = txtString.Text; 

    strlen = txtString.TextLength; 

    int[] counter = new int[strlen]; 

    for (int i = 0; i < strlen; i++) 
    { 
     for (int j = i + 1; j < strlen; j++) 
     { 
      if (str[i] == str[j]) 
      { 
       c += 1; 

      } 
     } 
     counter[i] = c; 
     c = 1; 
    } 
    for (int k = 0; k < counter.Length; k++) 
    { 
     lstFreqMeter.Items.Add(counter[k]); 
    } 
} 

在這段代碼中,當我點擊「檢查頻率」按鈕,程序給出,作爲輸出,每個字符和的頻率重複字符,並且還空間我們不想。

+0

嘗試像'txtString.Text.GroupBy(X => x).Select(x => new {chara = x.Key,frequency = x.Count()}).. – nawfal

回答

1

string上使用Count可以得到字符串中的字符數。

獲取每個字符的頻率,您可以迭代字符串並遞增整數。字典(鍵/值列表)將是一個很好的數據類型來保存這些數據。

const string textString = "aaabbbcccaaattteeevvvooo"; 
    var numberOfChars = textString.Count(); 

    var dictionary = new Dictionary<char,int>(); 
    foreach (var letter in textString) 
    { 
     if (dictionary.ContainsKey(letter)) 
      dictionary[letter]++; 
     else 
      dictionary[letter] = 1; 
    } 

該字典將包含一個鍵(char)和一個值(計數)。

+0

你忘了'Dictionary.Add(K,V)',這會導致運行時異常 – Charleh

+0

我剛剛在.net 4.5中運行。它應該是好的。你在哪一行得到異常? –

+2

@Charleh字典的索引器的setter將添加一個項目,如果它不存在,並替換它。現在這個答案是正確的。 – Servy

2

3個循環來完成這個是你出錯的地方。我認爲你正試圖讓它變得複雜。

它不願意回答作業問題,但方向的一些提示應該有所幫助。

  • 聲明一個Dictionary<char, int>
  • 進行一次完整的循環。對於你的字符串中的每個字符。
  • 在循環中,使用結果填充Dictionary<char, int>
  • 如果字符存在於字典中,請將int設置爲int ++,如果不是,則將該字符添加到int爲1的字典中。
  • 在循環之外,將AddRange添加到您的lstFreqMeter.Items。
+0

可以請你給我代碼 –

+0

是不是你的功課?我如何給你的代碼幫助你成爲更好的程序員?事實上,我實際上已經爲你僞編碼了。 – paqogomez

1

維護匹配字符的字典,並在匹配時增加每個字符的個數。

Dictionary<char, int> count = new Dictionary<char,int>(); 
string str = textString.Text; 
int len = str.Length; 
for(int i = 0; i < len; i ++) 
{ 
    if (str[i] == ' ') continue; 
    if (count.ContainsKey(str[i])) 
    { 
     count[str[i]] += 1; 
    } else { 
     count.Add(str[i], 1); 
    } 
} 

foreach(char key in count.Keys) 
{ 
    Console.WriteLine("{0} : {1}", key, count[key]); 
} 
+0

感謝您的回覆....當我輸入一個字符串「kkhank」它顯示輸出:k = 1,h = 1,a = 1,n = 1 ..............而不是顯示k = 3 –

+0

現在試試,我已經更正了增量計數器。 – Kami

1

嘗試這樣:

var letters = Enumerable.Range('A', 26).Select(i => (char)i); 
var sourceChars = letters.Concat(myString.ToUpperInvariant()); 
var results = from c in sourceChars 
         group c by c into g 
         where char.IsLetter(g.Key) 
         orderby g.Key 
         select new { Char = g.Key, Count = g.Count() - 1 }; 

foreach (var result in results) 
{ 
    Console.WriteLine("There are {0} {1}'s.", result.Count, result.Char); 
} 

這將返回一個類中的每個字母有多少次出現在myString

+0

感謝您的回答,但編譯器未檢測到「.ToUpperInvariant()」函數 –

+0

@MuzamilAbbas - 它是一個合法的函數。文檔[在這裏](http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant(v = vs.110).aspx)。仔細檢查以確保您不會拼錯。如果它仍然不起作用,請用'ToUpper(CultureInfo.InvariantCulture)'替換它' – Icemanind

+0

第一行是什麼? –

相關問題