2016-11-29 105 views
1

我剛開始分配霍夫曼編碼。第一步是實現某種形式的文件處理,它將讀入要處理的文件,然後對字符進行頻率計數。閱讀文件並打印出字母頻率

我有幾個不同的文本文件,以測試這種對抗 - 有些是字母,數字,符號大寫,小寫等

這是我到目前爲止有:

import java.io.*; 
public class LetterFrequency { 
int nextChar; 
char c; 
public static void main(String[] args) throws IOException { 
    File txtfile = new File("10000random.txt"); 
    BufferedReader in = new BufferedReader (new FileReader (txtfile)); 
     System.out.println("Letter Frequency:"); 

    int[] count = new int[26]; 

    while ((nextChar = in.read()) != -1) { 
     ch = ((char) nextChar); 
     if (ch >= 'a' && ch <= 'z') 
     count[ch - 'a']++; 
    } 


    for (int i = 0; i < 26; i++) { 
     System.out.printf("%c %d", i + 'A', count[i]); 
    } 



in.close(); 

} 

這顯然是一個基本的版本(只是處理az),我將如何改變這個以包含所有大寫字母,數字,符號等。猜測數組的大小似乎不對。如果這是一個明顯的問題,我很抱歉,我還在學習! 謝謝

+0

爲什麼不爲大寫,小寫,數字,符號等創建不同的數組? – rafid059

+1

或者你可以使用地圖<字符,整數>來存儲這個,而不需要知道你遇到 – nafas

+0

@nafas的字符,但不會保留字符的字典順序。 – rafid059

回答

0
String letterAsString = (ch+"").toUpperCase(); 

這是一個解決方案,如果你想以小寫字母相同的方式計算它們。

1

你是否支持單字節和雙字節字符?只有ASCII字符?

如果只有ascii,您可以使用(26 * 2)+ 10個可能值來覆蓋所有小寫字母,大寫字母和數字。

如果您覆蓋的不僅僅是ascii,還可以使用Map而不是數組。

Map<Integer, AtomicInteger> map = new HashMap<>(); 
... 
map.computeIfAbsent(ch, c -> new AtomicInteger()).getAndIncrement();