必做 1] 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 Result1.txt 文件。 (第一阶段初稿完成该要求)
- 命令行格式: 提示符> Myapp.exe -f filename.txt > Result.txt (PS:C++ 程序,Java 程序输出方式类似) filename.txt 为前面下载的文件名。
- 解释:
- 选项 -f 表示后面跟文件名
- 输出格式规定(参考作业3中的示例):
- 首先按照频率由高到低排序
- 频率一样的词, 按照字典顺序排序
- 此外, 读取一个较大的文本文件Gone_with_the_wind.txt实验对比程序执行效率,做如下改进,比较改进前后程序执行时间。PS: 请看一位同学做的效能分析示例。
原先程序中循环部分如下:
for (int i = 0; i < infoIds.size(); i++)
{
Entry<String, Integer> id = infoIds.get(i);
System.out.println(id.getKey()+":"+id.getValue());
}
改进后程序如下:
len= infoIds.size(); // 先计算
for (int i = 0; i < len; i++)
{
Entry<String, Integer> id = infoIds.get(i);
System.out.println(id.getKey()+":"+id.getValue());
}
作业中的例子用的是Java,所以准备用Java写一下。
package work;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import org.omg.CORBA.PUBLIC_MEMBER;
public class write {
public static String fun(String a)
{ if(a.contains(",")||a.contains("."))//单词含标点。
{ a=a.substring(0,a.length()-1);//把标点去掉。 return a; }
else return a;
}
public static void main(String []s1)
{ String s;
String []data=new String[1000];//存单词
String []value=new String[1000];//单词,不重复。
int []count=new int[1000];//对应个数。
int sum=0,i,j; for(i=0;i<1000;i++) //初始化个数。
{ count[i]=1; }
try { FileReader fileReader=new FileReader("D://A_Tale_of_Two_Cities.txt");
BufferedReader br=new BufferedReader(fileReader);
s=br.readLine();//读取第一行
while(s!=null)
{ String []ss=s.split(" ");//取出单词
for( i=0;i<ss.length;i++)
{ ss[i]=fun(ss[i]);//把标点去掉。
for(j=0;j<sum;j++)
{ if(ss[i].equals(value[j]))
{ count[j]++; break; }
}
if(j==sum)
{ value[sum++]=ss[i]; }
}
s=br.readLine();//读取文件下一行
}
for(i=1;i<count.length;i++)
{
for( j=0;j<count.length-i;j++)
{
if(count[j]<count[j+1])
{
m=count[j];
count[j]=count[j+1];
count[j+1]=m;
nn=value[j];
value[j]=value[j+1];
value[j++]=nn;
}
}
}
System.out.println(sum);
for(i=0;i<sum;i++)
{ System.out.println(value[i]+" "+count[i]); }
}
catch (FileNotFoundException e)
{ e.printStackTrace(); }
catch (IOException e)
{ e.printStackTrace(); }
}
}
其实思路也没什么变化,也是从文本中读取内容然后分成单词进行统计。最后加一个排序的数组进行排序。总的来说只会一点c++的我写Java还是有点不适应,大部分也是对着书打。就这也花了我很长的时间,应为不熟悉不懂。