作业三
我大一的时候做过这个题目,当时我用的是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();} } }
最后运行结果: