2012-11-04 390 views
1

我正在使用StreamReader將文本文件讀入程序。我需要將字符串中每個字母的頻率記錄到數組中(其中索引0將是A,依此類推)。最簡單的方法是什麼?計數字母頻率

編輯:我原來是這樣,直到我意識到這是完全錯誤的。

int counter = 0; 
int[] freq = new int[26]; // create frequency array 

// counts frequency 
while (counter < inValue.Length) 
{ 
     int A = 65; // ASCII value for "A" 
     char x = char.Parse(inValue.Substring(counter, 1)); // get individual characters from string 
     int s = (int)x; // cast character to integer value 

     if (s == A + counter) 
      freq[counter]++; 

      counter++; 
} 

其中inValue是StreamReader讀入程序的文本文件。

回答

1

你可以嘗試這樣的事情。這爲我工作,但我沒有用的StreamReader: -

int[] c = new int[(int)char.MaxValue]; 

string s = File.ReadAllText("text.txt"); 

foreach (char t in s) 
{ 
    c[(int)t]++; 
} 

for (int i = 0; i < (int)char.MaxValue; i++) 
{ 
    if (c[i] > 0 && 
    char.IsLetterOrDigit((char)i)) 
    { 
    Console.WriteLine("Letter: {0} Frequency: {1}",(char)i, c[i]); 
    } 
} 
+0

我給一個鏡頭,但是當我嘗試使用Console.WriteLine(C [0]),或任何其他指數,它總是打印出0 – mathanor

+1

@mathanor當然, 'c [0]'是charcode'0'的計數,沒有。 –

4
var freqs = File.ReadAllText("myfile.txt") 
        .Where(c => Char.IsLetter(c)) 
        .GroupBy(c => c) 
        .ToDictionary(g => g.Key, g => g.Count()); 

這應該給你字符的字典和他們的計數。

更新:

如果你想不區分大小寫的數,只是改變的GroupBy:

.GroupBy(c => Char.ToUpper(c)) // instead of .GroupBy(c => c) 

而且在我看來,一本字典是不是數組在這種情況下更好,因爲性格的「count」所屬的不僅僅是暗示的所指數;相反,它是一個明確的密鑰。這使查找更容易,因爲您不必將字符轉換爲索引。此外,這增加了添加國際化支持時的靈活性。但是,如果你絕對需要一個數組,它是一個簡單的變化:

var freqs = File.ReadAllText("myfile.txt") 
        .Where(c => Char.IsLetter(c)) 
        .GroupBy(c => c) 
        .OrderBy(g => g.Key) 
        .Select(g => g.Count()) 
        .ToArray() 
+0

我喜歡這個! :) – nawfal

0

一些修改您的代碼將使其工作,假設你只希望通過「Z」來算的字母「A」:

int counter = 0; 
int[] freq = new int[26]; // create frequency array 

// counts frequency 
while (counter < inValue.Length) 
{ 
    char c = invalue[counter]; 
    if (c >= 'A' && c <= 'Z') 
    { 
     ++freq[(int)c - 65] 
    } 
    ++counter; 
} 

如果你想數小寫字母以及,然後在循環改變的第一行:

char c = char.ToUpper(invalue[counter]); 
0

我花了相當一段時間才能找出這個LINQ的,這將導致確切的sa我數組你想要的:

int[] occurance = File.ReadAllText("myfile.txt") 
        .Where(c => char.IsLetter(c)) 
        .Select(c => (int)char.ToUpperInvariant(c) - 65) 
        .GroupBy(a => a) 
        .ToDictionary(a => a.Key, a => a.Count()) 
        .OrderBy(a => a.Key) 
        .Select(a => a.Value) 
        .ToArray();