作业4词频统计

必做 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还是有点不适应,大部分也是对着书打。就这也花了我很长的时间,应为不熟悉不懂。

原文地址:https://www.cnblogs.com/ROUGH-TALE/p/5303543.html