1、任务简介
本节任务是在上一次任务《Java文本处理5-统计文本中汉字的出现次数(乱序)》的基础上统计文本中汉字的出现次数并实现降序排序,第一个程序将结果打印出来,而第二个程序将结果保存到一个指定文本中。
2、基本任务和代码
(1)任务1
1)任务内容
统计指定文本中每一个汉字的出现次数实现降序排序,并将结果打印出来。
2)具体思路
(1)首先需要使用InputStreamReader类和BufferedReader类实现文本的读取,由于我使用的《西游记》为utf-8编码,所以还需要指定编码格式为utf-8;
(2)然后需要定义一个空的字符串变量,在对文本逐行读出后将读出的内容追加到该空字符串后;
(3)需要使用TreeMap方法来进行字频的统计,需要使用public static构造一个静态方法,由于是对字频进行统计,所以还需要确保字符为汉字才能进行统计,故还需要使用Matcher类进行字符串的匹配操作,若该字符为汉字则进行统计;
(4)在主函数中调用构造出来的TreeMap方法,并进行降序排序,本次任务仅需要在上一次任务的基础上使用Collections.sort()构造排序比较器再将每一个汉字的key值和value值打印出来即可,参考链接:点此查看,构造排序比较器思路大体如下:
首先,由于Map和Collections是同级别的,不能像List排序那样直接用Collections.sort()进行排序,故需要将map转换为list;
然后,使用Collections.sort()方法对这个list进行降序排序,其基本格式可以参考上文给出的链接;
最后,遍历该list然后输出降序排序的结果;
3)任务代码
程序保存为hanzi4.java,代码如下:
import java.io.*;//导入java.io包中的所有类
import java.util.*;//导入java.util包中的所有类
import java.util.Map.Entry;//导入java.util.Map包中的Entry类
public class hanzi4 {
//类名
public static void main(String[] args) {
//程序主函数
try {
//try代码块,当发生异常时会转到catch代码块中
//读取指定的文件
Scanner s = new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
System.out.println("请输入想要打开的文本文档:");//输入提示信息
String a = s.nextLine();//定义字符串变量,并赋值为用户输入的信息
//创建类进行文件的读取,并指定编码格式为utf-8
InputStreamReader read = new InputStreamReader(new FileInputStream(a),"utf-8");
BufferedReader in = new BufferedReader(read);//可用于读取指定文件
StringBuffer b = new StringBuffer();//定义一个字符串变量b,便于后续进行内容追加的操作
String str = null;//定义一个字符串类型变量str
int i = 0;//定义一个整型变量,用于统计字符串的出现次数
while((str = in.readLine()) != null) {
//readLine()方法, 用于读取一行,只要读取内容不为空就一直执行
b.append(str);//将该行内容追加到字符串b的后面
}
TreeMap<Character,Integer>tm =Pross(b.toString());//调用TreeMap函数
System.out.println("汉字统计结果:");//输出结果
List<Map.Entry<Character,Integer>> list = new ArrayList<Map.Entry<Character,Integer>>(tm.entrySet());//将map转换为list便于进行排序
//构造一个排序比较器
Collections.sort (l