单词统计
问题:
英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?哈利波特》 中最常用的短语是什么,等等。我们就写一些程序来解决这个问题,满足一下我们的好奇心。第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)如果两个字母出现的频率一样,那么就按照字典序排列。 如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。第1步:输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文本文件中的英语单词出现频率。单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。英文字母:A-Z,a-z字母数字符号:A-Z,a-z,0-9第1步:输出单个文件中的前 N 个最常出现的英语单词。分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词。
package com;
import java.io.File;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Map;
public class text {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("E://Eclipse//piao.txt");
// 统计和显示统计数据
Map<String, Integer> countMap = count(file);
for (Map.Entry<String, Integer> each : countMap.entrySet()) {
System.out.println(each.getKey() + "字母的个数: " + each.getValue());
}
}
private static Map<String, Integer> count(File f) {
Map<String, Integer> countMap = new HashMap<>();
try {
RandomAccessFile raf = new RandomAccessFile(f, "rw");
// 逐行读取
String line = null;
while (null != (line = raf.readLine())) {
// 判断行里面的每一个字符
char[] arr = line.toCharArray();
for (char ch : arr) {
// 将a-z转换成大写的A-Z
if (ch >= 'a' && ch <= 'z') {
ch -= 32;
}
// 统计
if (ch >= 'A' && ch <= 'Z') {
String key = String.valueOf(ch);
Integer value = countMap.get(key);
if (value == null) {
value = 0;
}
countMap.put(key, value + 1);
}
}
}
// 关闭IO流
raf.close();
} catch (Exception e) {
e.printStackTrace();
}
return countMap;
}
}