我的目标是在大型平面文件(1GB+)中创建每个字符的频率分布,以便以后导入数据库。理想情况下,输出是一个 ASCII 字符列表,每个字符后跟一个计数。
我目前正在使用 HashMap 来创建字符串中每个值的分布,并且它有点有效,我只是不确定如何在大文件上实现它。此外,在我的输出中,CR 和 LF(或/r/n)字符会产生一个新行,并在下一行中计数。
这是当前代码:
public class CharCount{
public static void main(String[] args) {
String s = "abcdefghijklmnopqrstuvwxyz1234567890,.)(/\\<>?!@#$%^&*_-+=\r\n";
char[] arr = s.toCharArray();
HashMap <Character,Integer> count = new HashMap<Character, Integer>();
for (char c : arr) {
try {
count.put(c, count.get(c)+1);
} catch (NullPointerException e) {
count.put(c, 1);
}
}
for (Character c: count.keySet()) {
System.out.println(c + " = " + (int)c + " = " + count.get(c));
}
}
}
理想的输出如下所示:
000 NUL 4124435 001 SOH 0
002 STX 0
003 ETX 0
.....
253 ý 0
254 þ 0
255 ÿ 0
非常感谢任何帮助!
最佳答案
如果您只处理 ASCII 字符,即 0-255 范围内的字符,那么只使用一个整数(或可能是一个长)数组 [256],然后读取文件(实际上一次读取一个字符)会更简单(当然,您可以使用缓冲或 NIO 来提高速度)并增加适当的 bin。
也就是说,您的 HashMap 代码看起来很合理,但我不确定您的问题是什么???
关于java - 文件中字符出现的计数/频率分布,包括不可见的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8734770/