zoukankan      html  css  js  c++  java
  • 作业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

  • 相关阅读:
    _bzoj1061 [Noi2008]志愿者招募【最小费用最大流】
    _bzoj2243 [SDOI2011]染色【树链剖分】
    _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】
    _bzoj1002 [FJOI2007]轮状病毒【瞎搞】
    leetcode 273 Integer to English Words
    leetcode 12 Integer to Roman
    leetcode 1071 Greatest Common Divisor of Strings
    lc6 ZigZag Conversion
    lc13 Roman to Integer
    leetcode 171 Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/mzfeng/p/5281347.html
Copyright © 2011-2022 走看看