作业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(),这样当同一频率在一起时,它还是按字典顺序排序。

文件存入如下图

对于大的文件,结果为:

posted @ 2016-03-22 22:11  浮世孤独  阅读(189)  评论(2编辑  收藏  举报