2016-11-29 14 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(); 

} 

これは明らかです基本バージョン(ちょうどaを扱う)、どのように大文字、数字、記号などをすべて含むようにこれを変更するのでしょうか?配列のサイズを推測する必要はないようです。

これは明白な質問である場合は謝罪、私はまだ学んでいます! は、あなたがそれらを小文字と同じようにカウントするようにしたい場合はソリューションです

+0

なぜ大文字、小文字、数字、記号などの異なる配列を作成しないのですか? – rafid059

+1

代わりにmap を使用して、 – nafas

+0

@nafasが出現する文字を知らなくてもこれを保存することができますが、文字は辞書順に保持されません。 – rafid059

答えて

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

ありがとうございます。

1

1バイト文字と2バイト文字の両方をサポートしていますか? ASCII文字のみ?

asciiだけの場合は、すべて小文字、大文字、数字をカバーするための(26 * 2)+ 10の値があります。

ASCII以外のものを扱う場合は、配列ではなくマップを使用できます。

Map<Integer, AtomicInteger> map = new HashMap<>(); 
... 
map.computeIfAbsent(ch, c -> new AtomicInteger()).getAndIncrement(); 
関連する問題