作业3-个人项目<词频统计>

      上了一天的课,现在终于可以静下来更新我的博客了。

 

      越来越发现,写博客是一种享受。来看看这次小林老师的“作战任务”。

 

                              词频统计

  • 单词:
  • 包含有4个4个以上的字母
  • 单词分隔符分开
  • 如果一个字符串包含_非_字母数字,则不是单词
  • 单词大小写不敏感,例如 “file”、“FILE”和“File”可以看作同一个单词
  • 单词必须是字母开头,“file123”是单词,“123file”不是单词

                简单理一下思路:

                1.从控制台输入英语句子(字符串)

                2.在句子中分割出一个一个单词

                3.要筛选出4个字母以上的单词

                4.还要把数字开头的字母筛选出去

                然后呢?食材都准备好了,就该动刀了:

                  

                     Scanner sc=new Scanner(System.in);
             //定义es接收英文句子字符串
             String es=null;
             System.out.println("请输入英语短句:");
              //小提示:next遇到空格返回,nextLine可读一行
                 es=sc.nextLine();
                 //为了不区分大小写,把所有字母转换成小写
                 es= es.toLowerCase();
                //这个类会将字符串分解
                 StringTokenizer token=new StringTokenizer(es);

                                   这里用到了一个类库:import java.util.StringTokenizer;

                                 小林老师那篇引用的博客里说它在字符串中无所不能。这里就用到

                                 一处:分割字符串。来看这行代码:

String word=token.nextToken(", ?.!:\"\"\''\n"); 

                                    当我从头读取输入的字符串时,遇到上述括弧里的非字母字符时,

                                    产生分割,即产生一个单词。

                                    接下来用到HashMap来统计单词出现的频率

 while(token.hasMoreTokens())
   {   
       //按照,[空格] ? . !,双引号,单引号,换行符去分割 
       String word=token.nextToken(", ?.!:\"\"\''\n"); 
       //取单词的第一个字符,调用函数isNumeric判断word的首字符是否为数字,并且判断单词长度是否大于3
        if( !isNumeric(word.subSequence(0,1))&&word.length()>=4)
          {  
            //统计单词的个数
               if(map.containsKey(word))
                 {     
                  int count=map.get(word);  
                  //如果HashMap已有这个单词,则使它的数量加1
                   map.put(word, count+1);
                  }  
             //如果没有第二个相同单词,数量为1 
             else                                    
                      map.put(word, 1);      
            }
      }  

                                    在遍历过程中, 我同时完成两件事:筛选掉以数字开头的单词,

                                    筛选出长度大于3的单词。

                                    这里提一下自己当时遇到的问题:如何判断单词是不是以数字开头

                                    呢?上网查了一下,一共有三种方法,我当然用了自己觉得比较简

                                    单的方法:正则表达式法。你也可能注意到上面的代码中调用了一个

                                    函数isNumeric(String chr),现在我pou出这个函数

      public static boolean isNumeric(CharSequence charSequence)
      { 
           Pattern pattern = Pattern.compile("[0-9]*"); 
           Matcher isNum = pattern.matcher(charSequence);
           if( !isNum.matches() )
           {
               return false; 
           } 
           return true; 
       }

                                                         完成以上任务就剩输出了

  List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
  System.out.println("该句子中所有长度大于3的单词出现的次数分别如下:");
  //输出结果
  for (int i = 0; i < infoIds.size(); i++)        
    {     
       Entry<String, Integer> id = infoIds.get(i);  
       System.out.println(id.getKey()+":"+id.getValue());  
    }  

                                                          使用小林老师作业中的实验数据(增加一个以数字

                                                         开头的单词),运行结果如下:

                                                        总结:这次作业学到了不少东西:正则表达式判断数字

                                                     字符,HashMap里的方法又学习一遍,取字符串的首字符。

                                                     记得一个老师说过:java语言跟外语很相似,无非是语法和

                                                     单词,而java的单词就是类库。而这次也感受到java类库的

                                                     强大。

  完整代码清单见:  https://github.com/miaozhongfeng/my-repository/blob/master/zuoye3.java

posted @ 2016-03-15 23:32  苗中峰  阅读(284)  评论(7编辑  收藏  举报