作业4(第一部分)
package 作业4; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.util.*; public class 按频率统计单词 { public static void main(String[] args) { try{ FileReader fr1=new FileReader("Gone_with_the_wind.txt"); //读取文本 BufferedReader bf1=new BufferedReader(fr1); String str1 = null;String [] str=null;String [] str2=null; Map<String,Integer> map = new TreeMap<String,Integer>(); /*map接口统计字母出现频率 注意TreeMap<String,Integer>和HashMap<String,Integer> 区别 * 前者先将字符串自动按字典顺序排序,后者不会 */ 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.length>1) { if(str2[j].charAt(0)==8217)break; else 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; } for (int j = 0; j < str.length; j++) { if(str[j]!=null) { Integer count = map.get(str[j]); //一个单词出现的次数 if(count==null) //如果没有出现过,置一次 { map.put(str[j],1); } else //如果以前出现过,那么次数加一 { map.put(str[j],++count); } } } } sort(map); //调用排序的方法,排序并输出 fr1.close(); bf1.close(); }catch(Exception e){ e.printStackTrace();} } public static void sort(Map<String,Integer> map){ List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o2.getValue() - o1.getValue()); } }); //排序 String [] str3=null; int len=infoIds.size(); int count=1; try{ FileWriter fw=new FileWriter("Result1.txt"); BufferedWriter bw=new BufferedWriter(fw); int q=0; for (int i = 0; i < len; i++) { //输出 Map.Entry<String, Integer> id = infoIds.get(i); if(id.getKey()!=null) str3=id.getKey().split(""); if( str3!=null&&str3.length>3) //str3可能为空,且这个控制只有含有3个字母以上的单词才打印 if(count<=5) { q=id.getValue(); bw.write(id.getKey()); bw.write(": "); bw.write(String.valueOf(q)); bw.write("\t"); count++; } else { q=id.getValue(); bw.write(id.getKey()); bw.write(": "); bw.write(String.valueOf(q)); bw.write("\r\n"); //换行 count=1; } } bw.close();fw.close(); }catch(Exception e){ e.printStackTrace();} } }
这次的作业和之前区别不大,只多了两个要求:1,将单词按出现频率排序。2,相同的频率以字典顺序排序
对于第一个要求,我们可以用排序算法解决,具体实现是这样的:
public static void sort(Map<String,Integer> map){ List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o2.getValue() - o1.getValue()); }
将已经键值好的map放入集合类‘ArrayList’中,再用Comparator接口进行按频率排序,这样实现了第一个要求。
对于第二个要求,我用TreeMap代替HashMap这样,键值的时候就自行按照字典顺序排序了,我再执行sort(),这样当同一频率在一起时,它还是按字典顺序排序。
文件存入如下图:
这次的作业和之前区别不大,只多了两个要求:1,将单词按出现频率排序。2,相同的频率以字典顺序排序
对于第一个要求,我们可以用排序算法解决,具体实现是这样的:
public static void sort(Map<String,Integer> map){ List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o2.getValue() - o1.getValue()); }
将已经键值好的map放入集合类‘ArrayList’中,再用Comparator接口进行按频率排序,这样实现了第一个要求。
对于第二个要求,我用TreeMap代替HashMap这样,键值的时候就自行按照字典顺序排序了,我再执行sort(),这样当同一频率在一起时,它还是按字典顺序排序。
文件存入如下图
:
对于大的文件,结果为: