程序功能:分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来。文本文件大约是30KB~300KB大小。
判断语言:English
判断文章:The Old Man And the Sea (老人与海)
文件大小:166KB
程序思路:
1、打开文件流
2、使用使用循环遍历文件流中的每个单词
3、判断该单词是否已出现过,未出现就添加进去,出现过就将wordsNumber下标对对应的值加1
4、输出频率前10单词的数量
5、关闭文件流
//导入相应的包
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Vector;
//自定义一个类
class Counter {
private Vector V=null;//此变量用来存放字符串数组即单词
private int wordsNumber[]=null;//统计下标所对应的单词的个数
public Counter()//构造函数
{
V = new Vector(1,1);
wordsNumber = new int[1];
}
private void add(String str,int n)//添加新增单词的方法
{
V.addElement(str);//添加新单词
int b[]=new int[n];//重新申请空间
for(int i=0;i<n-1;i++)//将原来记录的数据复制到新数组中
{
b[i]=wordsNumber[i];
}
wordsNumber=b;
wordsNumber[n-1]=1;//将新添加单词的数量计为一
}
public void judge(String str)//判断是否传入的字符串即单词,是否存在
{
int flag=0;
int i=0;
for (i = 0; i <V.size(); i++) {
if (V.elementAt(i).toString().equalsIgnoreCase(str)) {//用忽略字母大小的方法进行比较
wordsNumber[i]++;
flag=1; //设置了一个标志,以方便下面判断是否新添单词
break;//判断出有相同的单词,退出循环
}
}
if(flag==0)//判断是否新添单词
{
int n=i+1;
add(str,n);
}
}
void output()//控制输出
{
int max=0;
int flag=0;
for(int i=1;i<=11;i++)//输出十个
{
max=wordsNumber[0];
for(int j=0;j<V.size();j++)//找出所统计单词,出现最多的
{
if(max<wordsNumber[j])
{
max=wordsNumber[j];
flag=j;
}
}
System.out.print("单词数量第"+i+"名: ");
System.out.print(V.elementAt(flag+1)+"的个数为:");
System.out.println(wordsNumber[flag]);
wordsNumber[flag]=0;//将输出的单词的统计数量置为零
}
}
}
public class CoutWords {//主类
public static void main(String[] args) throws IOException {
Counter counter=new Counter();
FileInputStream rf=new FileInputStream("D:lryh.txt");//读取文件
int b;
char wordsNumber;
String strr=new String();
while((b=rf.read())!=-1)//循环读取文件
{
wordsNumber=(char)b;
if((wordsNumber>='a'&&wordsNumber<='z')||(wordsNumber>='A'&&wordsNumber<='Z'))//判断读取的是不是字母
{
strr=strr.concat(""+wordsNumber);//字母连接成单词
}
else
{
counter.judge(strr);//单词的统计
strr=new String();
}
}
rf.close();//关闭输入流
counter.output();//输出结果
}
}