作业三

      我大一的时候做过这个题目,当时我用的是c++。我那个时候的想法比较朴素,算法也比较烦索,具体想法是这样的:我先把要统计的文本f1以空格分界一个个单词的读入,在读入的时候把大写全变小写,特殊字符消去,存入全新的文本f2。然后复制f2到新的f3。把f3与f2比较去掉f3中重复单词,即将所有相同的单词只保留一个,变成一个全新的f3文件。最后将f3中的单词一个个拿出来与f2的比较,统计出每个单词出现的次数。

         现在用java做的时候,我就不想用这种方法了,然后上网找思路的时候,看到了一种方法,就是用java中的map接口。map可以避免很多上述文本复制的麻烦,但是去掉无用字符的时候费了一点时间,最后我是先按行读取字符串,然后以空格切割成单个字符串,然后再把单个字符串分割成一个个的单个字符的字符串,然后用个if语句去掉无用字符,再连接起来,全体变小写,放入字符串数组中。最后用map接口,只保留一个单词,和出现的字数。最后用一个if语句把字符串长度大于3的输出

package 统计单词个数;
import java.io.*;
import java.util.*;

public class 统计单词 {
    public static void main(String[] args) 
    {
      try{
          FileReader fr1=new FileReader("单词文本2.txt");   //读取文本
          BufferedReader bf1=new BufferedReader(fr1);
          String str1 = null;String [] str=null;String [] str2=null;
          while((str1=bf1.readLine())!=null)            //按行读取
          {                                                                                       
              str=str1.split(" ");                      //按空格切分字符串               
                for(int i=0;i<str.length;i++)
                 {
                  str2=str[i].split("");                //把一个字符串分为一个一个的字符,主要目的是为了好把字母以外的符号去掉
                  String a=null;
                  for(int j=0;j<str2.length;j++)       
                  {                      
                      if(str2[j].charAt(0)>='A'&&str2[j].charAt(0)<='Z'||str2[j].charAt(0)>='a'&&str2[j].charAt(0)<='z')
                      {
                          str2[j]=str2[j].toLowerCase();  //大写变小写
                          if(a==null)
                              a=str2[j];
                          else
                              a=a+str2[j];                //一个完整的只有字母的字符串即完整的单词
                      }                                                                  
                  }
                  str[i]=a;              
                 }
            }
         fr1.close(); bf1.close();    
        Map<String,Integer> map = new HashMap<String,Integer>(); //map接口统计字母出现频率
        for (int j = 0; j < str.length; j++) 
        {
          Integer count = map.get(str[j]);       //一个单词出现的次数
          if(count==null)                        //如果没有出现过,置一次
          {
          map.put(str[j],1);
          }
          else                                  //如果以前出现过,那么次数加一
          {
          map.put(str[j],++count);
          }
        }
        String [] str3=null; 
        for(Map.Entry<String,Integer> entry : map.entrySet())
        {
            if(entry.getKey()!=null)               
              str3=entry.getKey().split("");
            if( str3!=null&&str3.length>3)                     //str3可能为空,且这个控制只有含有3个字母以上的单词才打印
              System.out.println(entry.getKey() +": "+"\t"+ entry.getValue());
        }
     }catch(Exception e){
            e.printStackTrace();}
}
}

最后运行结果:

posted @ 2016-03-16 21:28  浮世孤独  阅读(207)  评论(0编辑  收藏  举报