读入文件并打印出字母频率

时间:2016-11-29 15:50:24

标签: java frequency huffman-code

我刚刚开始使用霍夫曼编码。第一步是实现某种形式的文件处理,它将读入要处理的文件,然后对字符进行频率计数。

我有几个不同的文本文件来测试它 - 有些是字母,数字,符号,大写,小写等。

这是我到目前为止所做的:

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-z),我如何更改它以包括所有大写字母,数字,符号等。似乎没有必要猜测数组的大小。

道歉,如果这是一个明显的问题,我还在学习! 谢谢

2 个答案:

答案 0 :(得分:1)

您是否同时支持单字节和双字节字符?只有ASCII字符?

如果只有ascii,你有(26 * 2)+ 10个可能的值来覆盖所有小写,大写和数字。

如果覆盖的不仅仅是ascii,则可以使用Map而不是数组。

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

答案 1 :(得分:0)

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

如果您想以与小写字母相同的方式计算它们,那就是一个解决方案。