Java文本处理5-统计文本中汉字的出现次数(乱序)

1、任务简介

本节任务是编写一个Java程序,可以统计指定文本中每一个汉字的出现次数,第一个程序将结果打印出来,而第二个程序将结果保存到一个指定文本中。


2、基本任务和代码

(1)任务1

1)任务内容

统计指定文本中每一个汉字的出现次数,并将结果打印出来。

2)具体思路

(1)与之前的处理方法一样,首先需要使用InputStreamReader类和BufferedReader类实现文本的读取,由于我使用的《西游记》为utf-8编码,所以还需要指定编码格式为utf-8;

(2)然后需要定义一个空的字符串变量,在对文本逐行读出后将读出的内容追加到该空字符串后;

(3)需要使用TreeMap方法来进行字频的统计,需要使用public static构造一个静态方法,由于是对字频进行统计,所以还需要确保字符为汉字才能进行统计,故还需要使用Matcher类进行字符串的匹配操作,若该字符为汉字则进行统计;

(4)在主函数中调用构造出来的TreeMap方法,并将结果打印出来,然后迭代每一个汉字的Value值可以得到总字符数(与《Java文本处理3-统计文本行数、字符数、汉字、数字、字母数等》中的统计结果进行对比可以验证该方法的准确性);

3)任务代码

程序保存为hanzi2.java,代码如下:

import java.io.*;//导入java.io包中的所有类
import java.util.*;//导入java.util包中的所有类
public class hanzi2 {//类名
    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("汉字统计结果:"+tm);//输出结果
		    Iterator<Integer>it = tm.values().iterator();//获取tm中value值并迭代
		    while(it.hasNext()) {//检查序列中是否含有元素,若有则为true
		    	Integer j=(Integer)it.next();//定义变量获取元素
		    	i+=j;//迭代求总字符数
		    }
            in.close();//关闭流
            System.out.println("总汉字数为"+i);//输出总的汉字数
        } catch (IOException e) {//当try代码块有异常时转到catch代码块
        	e.printStackTrace();//printStackTrace()方法是打印异常信息在程序中出错的位置及原因
        }
    }
	public static TreeMap<Character,Integer>Pross(String str) {//构造TreeMap统计方法
		String d = null;//定义一个字符串类型变量
		char[] charArray = str.toCharArray();//将字符串转换为字符数组
		TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();//定义一个TreeMap集合
		for(int x = 0;x < charArray.length;x++) {//循环遍历字符数组
			d=Character.toString(charArray[x]);//返回一个字符串对象
			if (d.matches("[\\u4e00-\\u9fa5]")) {//if语句的条件,判断是否为汉字
				if(!tm.containsKey(charArray[x])) {//if语句的条件,判断该汉字是否在tem中
					tm.put(charArray[x], 1);//若该汉字不在tem中则初始化其value值为1
				} else {//若该汉字在tem中
					int count = tm.get(charArray[x])+1;//其出现次数增加1
				    tm.put(charArray[x],count);//若汉字在tem中则其value值为count
			    }
			}
		}
		return tm;//返回
	}
}

4)运行结果

所有文件均保存在路径D:\demo4下,在命令行中对程序进行编译,然后运行程序读取路径下的txt文档,结果如下:
Java文本处理5-统计文本中汉字的出现次数(乱序)_第1张图片
从图中可以看出,统计结果已经在黑屏幕上打印了出来。


(2)任务2

1)任务内容

统计指定文本中每一个汉字的出现次数,并将结果输出到一个指定的文本文档中(将任务1的输出内容保存到指定文本文档中)。

2)具体思路

(1)首先在任务1的基础上加上一个Scanner类,用于读取用户想要存入的文档路径和文档名;

(2)然后使用PrintStream类直接打印输出流,将内容保存到指定路径即可;

3)任务代码

程序保存为hanzi3.java,代码如下:

import java.io.*;//导入java.io包中的所有类
import java.util.*;//导入java.util包中的所有类
public class hanzi3 {//类名
    public static void main(String[] args)  {//程序主函数
//    	PrintStream out;
        try {//try代码块,当发生异常时会转到catch代码块中
        	//读取指定的文件
        	Scanner s1 = new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
        	Scanner s2 = new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
        	System.out.println("请输入想要打开的文本文档:");//输入提示信息
        	String a = s1.nextLine();//定义字符串变量,并赋值为用户输入的信息
        	System.out.println("请输入想要写入内容的文本文档:");//输入提示信息
        	String e = s2.nextLine();//定义字符串变量,并赋值为用户输入的信息
        	File file=new File(e);//用命令行参数直接写入待写入文件	
			if(!file.exists()) {//if语句的条件,若指定路径下该文件不存在
	            file.createNewFile();//则在指定路径下新建该文件
	            }
        	//创建类进行文件的读取,并指定编码格式为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函数
			PrintStream out = new PrintStream(file);//打印输出流,并指定保存路径
            System.setOut(out);//改变输出流并将内容保存到指定路径
			System.out.println("汉字统计结果:"+tm);//输出结果
		    Iterator<Integer>it = tm.values().iterator();//获取tm中values值并迭代
		    while(it.hasNext()) {//检查序列中是否含有元素,若有则为true
		    	Integer j=(Integer)it.next();//定义变量获取元素
		    	i+=j;//迭代求总字符数
		    }
            in.close();//关闭流
            System.out.println("总汉字数为"+i);//输出总的汉字数
        } catch (IOException e) {//当try代码块有异常时转到catch代码块
        	e.printStackTrace();//printStackTrace()方法是打印异常信息在程序中出错的位置及原因
        }
    }
	public static TreeMap<Character,Integer>Pross(String str) {//构造TreeMap统计方法
		String d = null;//定义一个字符串类型变量
		char[] charArray = str.toCharArray();//将字符串转换为字符数组
		TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();//定义一个TreeMap集合
		for(int x = 0;x < charArray.length;x++) {//循环遍历字符数组
			d=Character.toString(charArray[x]);//返回一个字符串对象
			if (d.matches("[\\u4e00-\\u9fa5]")) {//if语句的条件,判断是否为汉字
				if(!tm.containsKey(charArray[x])) {//if语句的条件,判断该汉字是否在tem中
					tm.put(charArray[x], 1);//若该汉字不在tem中则初始化其value值为1
				} else {//若该汉字在tem中
					int count = tm.get(charArray[x])+1;//其出现次数增加1
				    tm.put(charArray[x],count);//若汉字在tem中则其value值为count
			    }
			}
		}
		return tm;//返回
	}
}

4)运行结果

(1)所有文件均保存在路径D:\demo4下,在命令行中对程序进行编译,然后读取路径下的《西游记》文档xyj.txt,然后将内容保存到该路径下的xieru1.txt文档中,命令行操作如下:
Java文本处理5-统计文本中汉字的出现次数(乱序)_第2张图片

(2)打开路径D:\demo4下的xieru1.txt文档,显示如下:
Java文本处理5-统计文本中汉字的出现次数(乱序)_第3张图片
通过该方法就成功地将任务1中打印到黑屏幕上的内容写入了指定的文本文档,并且统计出来的总汉字数为589702个,与《Java文本处理3-统计文本行数、字符数、汉字、数字、字母数等》中的统计结果相同,从而也验证了本博客方法的准确性。


3、总结

本次任务实现了统计指定文本中每一个汉字的出现次数,并将结果打印到黑屏幕或者保存到一个指定文本中,达到了预期的效果,但是不足之处在于未将汉字按照出现频数进行排序,这也是后续任务中我想要实现的,所以该部分内容我也会在后面的博客中进行更新。

你可能感兴趣的:(Java,Java)