【java文本处理】实现txt文档中汉字频率排序及输出频率最高的前十个汉字

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
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值