01. 目的
java编程实现统计文档中汉字出现的频率,将汉字出现频率按高频到低频排序,并输出频率最高的前十个汉字。
02. 主要实现方法
(1) 首先按行读出txt文档中的内容:.readLine();
按行读出后取出每行中的字符: .charAt(i);
(2) 构建了HashMap对象,用于存放文档中出现的汉字及其出现的频率。键对应字符,值对应字符出现的次数。
HashMap<Character,Integer> hm = new HashMap<Character,Integer>();
判断汉字是否重复出现(汉字即为map中的键):用map类的containsKey()方法;
取出该键中的值(即汉字出现的频率):.get(key) ;
(3)重写public int compare(Object o1, Object o2) 方法,用Comparator类中的compare(T o1,T o2)对汉字频率比较大小。
可参考博文:【Java】Collections.sort() 方法 —— Comparable、Comparator接口
compare(T o1, T o2)是中的o1,o2代表什么,是怎么实现排序的?怎么和compareTo()配合使用?
o1和o2每次只取一个数据,就一次只比较两个数据,假如比较7,8,9,5,6,那么第一次比较o1先取8,o2取7(很奇怪,我当时以为是顺着取值,但是很奇怪,他是相邻两个值逆着取值),接下来配合compareTo()实现这两个数的排序,o1.compareTo(o2)会返回一个int值,如果0说明o1和o2相等,如果返回负值,那么o1和o2会倒序排序,返回正值,那么o1和o2会正序排序。返回值之后这两个值就进行了排序,至此,这两个值已经排序好了,接下来第二次排序,o1取9,o2取8,第三次o1取5,o2取9…
(4)通过entrySet()方法将map集合中的映射关系取出导入List动态数组,用Collections.sort()对值进行排序
(5)使用迭代器Iterator取出map中的键和对应的值。
Iterator<Map.Entry<Character, Integer>> iter = list.iterator();
03. 程序代码(sequence.java)
/*
* 功能:* 对文档中汉字出现频率进行排序
* * 在控制台打印频率最高的前十个汉字
* @author WTCLAB_yd
*
*/
import java.io.*;//导入io类包
import java.util.*;//导入util类包
public class sequence {
public static void main(String[] args){
File file=new File(args[0]);//建立读入文件对象
BufferedReader buf=null;
try{
buf = new BufferedReader(new FileReader(file));//定义字符读取(缓冲)流并赋值
String value = null; //定义一个临时接收文件中的字符串变量
String newValue = ""; //接收文件中所有字符串的变量
while((value = buf .readLine())!=null){
for(int i=0;i<value.length();i++){
//开始读取文件中的字符
if(value.charAt(i)>=0x4e00 && value.charAt(i)<=0x9fbb){
newValue = newValue+value.charAt(i); //存入newValue变量中
}
}
}
char[] ch = newValue.toCharArray();//把newValue变成字符数组(Collections. reverseOrder())
HashMap<Character,Integer> hm = new HashMap<Character,Integer>();//构建了一个新的HashMap对象,赋予变量hm.键对应字符,值对应字符出现的次数
for(int j = 0;j<ch.length;j