找出文本中最长/最短的句子,出现次数最多的句子,求平均句长,方差。
思路:
(1)将文本按特定的方式进行切分(本文以。!?切分;
(2)创建两个数组,数组1存放切分后每句话的长度,数组2存放切分后的每句话;
(3)找最长句只需找到数组1中长度最长那一个,即可输出,最短同理;次数最多句子则需要遍历所有句子,找到相同的句子,对应的次数加1,最后输出次数最多那一个即可。
(4)总字符长度除以总句子数即平均句长;
(5)方差公式:
s
2
=
(
(
x
1
−
x
)
2
+
(
x
2
−
x
)
2
+
(
x
3
−
x
)
2
+
.
.
.
+
(
x
n
−
x
)
2
)
/
n
s^2=((x_1-x)^2+(x_2-x)^2+(x_3-x)^2+...+(x_n-x)^2)/n
s2=((x1−x)2+(x2−x)2+(x3−x)2+...+(xn−x)2)/n
代码如下:
//文件名:Length.java
import java.io.*;
import java.util.*;
class Length
{
public static void max(int a[],String mystr[])
{
int max=a[0];//令a[0]为max
for(int i=0;i<a.length;i++)//找出最大的a[i]为max
{
if(a[i]>max)
{
max=a[i];
}
}
for(int i=0;i<a.length;i++)//找出长度最长的句子
{
if(a[i]==max)
{
System.out.println("长度最长的:"+mystr[i]+" 共"+max+"字符");//输出长度最长的句子
}
}
}
public static void min(int a[],String mystr[])
{
int min=a[0];//令a[0]为min
for(int i=0;i<a.length;i++)//找出最小的a[i]为min
{
if(a[i]<min&&a[i]>0)
{
min=a[i];
}
}
int j=0;
for(int i=0;i<a.length;i++)//找出长度最短的句子
{
if(a[i]==min)
{
System.out.println("长度最短的:"+mystr[i]+" 共"+min+"字符");//输出长度最短的句子
}
}
}
public static void nums(String mystr[])
{
int[] a=new int[mystr.length];//令数组a为每个句子长度
for(int i=1;i<mystr.length;i++)//给a[1]、a[2]、a[3]...赋值为1
{
a[i]=1;
}
for(int i=1;i<mystr.length;i++)//找出相同句子的次数
{
for(int j=i-1;j>=0;j--)//遍历所有的句子
{
if(mystr[i].equals(mystr[j]))//判断两个句子是否相同,相同则a[i]+1
a[i]++;
}
}
int max=a[0];//令a[0]为max
for(int i=0;i<a.length;i++)//找出最大的a[i]为max
{
if(a[i]>max)
max=a[i];
}
for(int i=0;i<a.length;i++)//找出出现次数最多的句子
{
if(a[i]==max)
System.out.println("\n出现次数最多的:"+mystr[i]+" 共"+max+"次");
}
}
public static void main(String[] args) throws Exception
{
long startTime = System.currentTimeMillis(); //定义一个开始时间
File file = new File(args[0]);//创建一个文件对象
BufferedReader br=new BufferedReader(new FileReader(file)); 定义字符读取流
String value = null; //定义一个临时接收文件中的字符串变量
String newValue =""; //接收文件中所有字符串的变量
int sum=0;
while((value = br.readLine())!= null) //开始读取文件中的字符
{
newValue = newValue + value; //存入newValue变量中
}
String[] mystr=newValue.split("。|!|?");//以句号/感叹号/问号分句
int[] a=new int[mystr.length];//文本的长度放在数组中
for(int i=0;i<mystr.length;i++)//给a[0]、a[1]、a[2]...赋值为0
{
a[i]=0;
}
for(int i=0;i<mystr.length;i++)//令a[i]等于每个字符串的长度
{
a[i]=mystr[i].length();
sum=a[i]+sum;//求字符串的总长度
//System.out.println(a[i]);//输出每个句子的字长
}
double x=(double)sum/(double)mystr.length;//平均句长
double xx=0.0,s=0.0;
System.out.println("平均句长"+x);
for(int i=0;i<mystr.length;i++)
{
xx=Math.pow((a[i]-x),2)+xx; //求n的平方:Math.pow(n,2)
}
s=xx/mystr.length;//求方差
System.out.println("方差:"+s);
max(a,mystr);//调用max找出长度最长的句子
min(a,mystr);//调用max找出长度最短的句子
nums(mystr);//调用nums找出出现次数最多的句子
long endTime = System.currentTimeMillis(); //定义一个结束时间
System.out.println("\n耗时:" + (endTime - startTime) + "毫秒");//输出所用时间
}
}
结果如下:
(test.txt)
(西游记.txt)