作业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