我刚刚开始使用霍夫曼编码。第一步是实现某种形式的文件处理,它将读入要处理的文件,然后对字符进行频率计数。
我有几个不同的文本文件来测试它 - 有些是字母,数字,符号,大写,小写等。
这是我到目前为止所做的:
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),我如何更改它以包括所有大写字母,数字,符号等。似乎没有必要猜测数组的大小。
道歉,如果这是一个明显的问题,我还在学习! 谢谢
答案 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();
如果您想以与小写字母相同的方式计算它们,那就是一个解决方案。