【发布时间】:2016-11-29 15:50:24
【问题描述】:
我刚刚开始一项关于霍夫曼编码的作业。第一步是实现某种形式的文件处理,读取要处理的文件,然后对字符进行频率计数。
我有几个不同的文本文件来测试这个 - 有些是字母、数字、符号、大写、小写等。
这是我目前所拥有的:
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),我将如何更改它以包含所有大写字母、数字、符号等。似乎不必猜测数组的大小。
抱歉,如果这是一个明显的问题,我仍在学习! 谢谢
【问题讨论】:
-
为什么不为大写、小写、数字、符号等创建不同的数组?
-
或者你可以使用 map
来存储它而不需要知道你遇到的字符 -
@nafas 但这不会使字符保持字典顺序。
-
@RafiduzzamanSonnet 问题没有指定对字符进行排序,地图旁边可以排序但是需要排序...
-
没有文本,只有编码文本。如果将文件作为文本文件提供,则还必须提供用于制作它们的字符编码,然后使用该编码(例如 UTF-8)通过文本库(例如 Scanner)读取它们。无论如何,如果您使用 Java 的
String、Character或char,您的代码必须处理 UTF-16 代码单元,代表 Unicode 代码点,代表 graphemes。或者,将文件作为字节序列并对字节值执行频率计数可能要简单得多。
标签: java frequency huffman-code