Java文本处理12-找出文本最长句与最短句并计算方差

1、任务简介

在分句完成后我们可以统计出每一个句子的长度(指句子包含的汉字数),在此基础上我们可以找出最长的句子和最短的句子,并且可以计算出句子长度的方差,本节任务的第一个程序是将结果打印出来,第二个程序是将结果保存到一个指定文本文档中。


2、基本任务和代码

(1)任务1

1)任务内容

找出文本的最长句和最短句,并计算出文本的句长方差,将结果打印到黑屏幕上。

2)具体思路

(1)首先需要使用InputStreamReader类和BufferedReader类实现文本的读取,由于我使用的文本文档均为utf-8编码,所以还需要指定编码格式为utf-8;

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

(3)定义一个TreeMap集合并通过该集合排序,由于我们需要找出最长句和最短句,所以可以通过TreeMap中的Key值进行排序,并且将集合定义为TreeMap<Integer,String>的形式,使其Key对应句子的汉字数,由于Key默认是升序排序,所以可以使用lastKey()方法可以获取一个最高键(对应汉字数最多的句子),也就是最长的句子,再使用firstKey()方法获取最短的句子;

(4)逐行读出文档,然后使用for循环对该行中的每一个字符进行遍历,使用toString()方法得到每一个字符,再使用if语句和matches()方法检测字符是否为汉字,若匹配则对指定的变量进行自增,求出每一句的汉字数和总的汉字数;

(5)再使用if语句和equals()方法字符是否为“。” “!”和“?”三种符号之一,若为其中之一则句子数+1,并且需要将该句的汉字数和内容添加到TreeMap集合中,再将统计变量重置从而满足下一句的循环统计,其中我还注释了输出语句,该语句可以用于输出读取到的每一句话及其长度,有需要时可以取消注释;

(6)使用总汉字数\总句子数就可以得到该文本中每一句话的平均句长,得到该值是求方差的基础,方差计算公式如下:
在这里插入图片描述
式中M为平均句长,x表示每一句话的长度,n为总句子数;

(7)最后使用keySet()方法获取TreeMap集合的键值对,获取其Key值即为每一句的长度,分别用每一句的长度减去平均长度后取平方相加,再用累加后的结果除以总句子数即为句长方差;

3)任务代码

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

import java.io.*;//导入java.io包中的所有类
import java.util.*;//导入java.util包中的所有类
public class juzi5 {
   //类名
    public static void main(String[] args)  {
   //程序主函数
        try {
   //try代码块,当发生异常时会转到catch代码块中
        	//读取指定的文件
        	Scanner s1 = new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
        	System.out.println("请输入想要打开的文本文档:");//输入提示信息
        	String a1 = s1.nextLine();//定义字符串变量,并赋值为用户输入的信息
        	//创建类进行文件的读取,并指定编码格式为utf-8
        	InputStreamReader read = new InputStreamReader(new FileInputStream(a1),"utf-8"); 
            BufferedReader in = new BufferedReader(read);//可用于读取指定文件     
			StringBuffer b = new StringBuffer();//定义一个字符串变量,便于后续进行内容追加的操作
			String str = null;//定义一个字符串类型变量
			String d = null;//定义一个字符串类型变量
			String g = "";//定义一个字符串类型变量
			double e = 0;//定义一个double型变量,用于统计总句子数
			double c1 = 0;//定义一个double型变量,用于统计总汉字数
			int c2 = 0;//定义一个int型变量,用于统计每一句包含的汉字数
			TreeMap<Integer,String> tm=new TreeMap<Integer,String>();//定义一个TreeMap集合
			while((str = in.readLine()) != null) {
   //readLine()方法, 用于读取一行,只要读取内容不为空就一直执行
				b.append(str);//将该行内容追加到字符串b的后面
				for (int j = 0; j < str.length(); j
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值