相关的类:

  java.util.regex.Pattern

    static Pattern compile(String regex)        //编译模式

    static Pattern compile(String regex, int flags)    //编译模式并指定标志

    Matcher matcher(CharSequence input)       //根据这个模式创建matcher对象

    String pattern()                 //返回这个对象的模式匹配字符串

    String[] split(CharSequence input)         //根据指定的模式分隔字符串为数组

  java.util.regex.Matcher

    boolean find()          //尝试查找下一个匹配的子串,找到返回true

    int start()            //上一个匹配的子串开始的索引位置

    int end()            //上一个匹配的子串的结尾的后一个位置索引

    String group()          //返回上一个匹配的子串

    int groupCount()         //返回匹配组模式的个数

    Pattern pattern()         //返回模式匹配字符串

思路:

  这么要求肯定是要用正则的了,然后以字母开头,"\\b[A-Za-z]", 然后呢单词里可以包含字母数组"[A-Za-z0-9]",不要用"\\w", 这个里还有个下划线,然后单词长度大于等于4, 组合一下就是"\\b[A-Za-z][A-Za-z0-9]{3,}\\b", 结尾肯定是字母或数字无疑了。然后就是根据模式查找匹配的子串,转换为小写存入Map中。提取映射的键名到集合中,最后用一个迭代器根据键名的集合循环读出映射中的值。

源程序:

  贴个程序吧:

  

 import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set; public class countcha { public static void main(String[] args)
{
Map<String,Integer> numcount=new HashMap<String,Integer>();
//regex
Pattern pat=Pattern.compile("\\b[A-Za-z][A-Za-z0-9]{3,}\\b");
Scanner in=new Scanner(System.in);
System.out.print("please input a string:");
String sda=in.nextLine();
in.close();
Matcher mth=pat.matcher(sda);
boolean tf=mth.find();
while(tf)
{
String buffer=mth.group().toLowerCase();
numcount.put(buffer, numcount.get(buffer)==null?1:numcount.get(buffer)+1);
tf=mth.find();
} Set<String> countSet=numcount.keySet();
//output
Iterator<String> point=countSet.iterator();
while(point.hasNext())
{
String value=(String)point.next();
System.out.println(value+":"+numcount.get(value));
}
}
}

运行结果:

  task3:词频统计-LMLPHP

附加:

另外还有个说从文本读入数据统计单词个数的,这个差不多,按行读取,然后模式循环匹配直到文件结尾,如果发现单词则查询已存在的映射中是否已有,有则加1, 没有则置1。最后输出映射中的内容。我用的数据是“because of you”这首歌词,命名为becauseofyou.txt放在项目根目录下了。测试结果:

task3:词频统计-LMLPHP

结论:

  预计用时1h, 结果正则卡死我了,不太熟悉,用时4h+。

具体源码地址:https://github.com/blocksmz/task3

05-11 22:17