• 哈利波特全文字母以及单词的统计


       今天课上老师进行课堂测试,要求统计哈利波特全文的字母以及单词,对这次测试做一个简单的总结:

     读取文件内容肯定是必须的,创建文件读取类的对象,并且按行读取,创建HashMap集合,以String为键,Integer为键值。

    读取完成以后用list集合来排序,sort是升序。

    读取单词的话可以用正则表达式来排除其他标点符号的干扰,并将读取到的语句安单词分割

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;
    public class word2 {
        public static void main(String[] args)throws IOException//扔掉很重要
        {
             File file = new File("word.txt");
             System.out.println("1.统计英文单词个数"+"  "+"2.统计字母个数");
             Scanner sc = new Scanner(System.in);
             int value=sc.nextInt();
          
             switch(value) {
                
                      case 1:txtString2(file);
                             break;
                      case 2:txtString(file);
                     
             }
         }
      
        
        
        
        /*
         * 统计字母
         */
        public static void txtString(File file) throws IOException{
            try {
                //IO操作读取文件内容
                FileReader fr = new FileReader(file);
                @SuppressWarnings("resource")
                BufferedReader br = new BufferedReader(fr);//构造一个BufferedReader类来读取文件        
                HashMap<String,Integer> hm = new HashMap<String,Integer>();//构建了一个新的HashMap对象,强制指定这个HashMap必须是以String为key, 以Integer为值。 
                String line =null;
                Integer count = 0;//每个字母的个数
                Integer total = 0;//统计字母总数,作百分比用
                char ch;
                while ((line=br.readLine())!=null) {
                    for(int j=0;j<line.length();j++) {
                         ch=line.charAt(j); 
                       if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {//将字符串对象中的字符转换为一个字符数组。
                      total = total + 1;
                   
                        count=hm.get(ch+"");
                       if(count==null) {
                           count=1;
                       }
                       else {
                           count++;
                       }
                       hm.put(ch+"",count); 
                       }
                    }
                }
                /*
                
                for (String str : hm.keySet()) {//设变量str获取键
                    lv=list.get(list.size()-i-1).getValue()*1.0/total*100;
                    System.out.println(str+"个数:"+hm.get(str)+"        "+String.format("%.2f", lv)+"%");   
                }*/
                System.out.println("总字母个数:"+total);
                
                List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(hm.entrySet());
              //在java中,如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标
                      Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
                          public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
                              return (left.getValue().compareTo(right.getValue()));
                          }
                      };
                      // 集合默认降序
                      Collections.sort(list,comparator);
                      double lv=0;
                      for(int i=0;i<52;i++){// 由高到低输出
                          lv=list.get(list.size()-i-1).getValue()*1.0/total*100;
                          System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue()+"    "+String.format("%.2f", lv)+"%");
                      }
                
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        
        
        /*
         * 统计单词
         */
         public static void txtString2(File file)  throws IOException{
             FileReader fr = new FileReader(file);
             BufferedReader br = new BufferedReader(fr);//构造一个BufferedReader类来读取文件    
             StringBuffer sb = new StringBuffer();
             String line =null;
             while ((line=br.readLine())!=null){
                sb.append(line);//将读取出的字符追加到stringbuffer中
            }     
            fr.close();
           // 关闭读入流
                 String str = sb.toString().toLowerCase(); // 将stringBuffer转为字符并转换为小写
                 String[] words = str.split("[^(a-zA-Z)]+");  // 非单词的字符来分割,得到所有单词
                 Map<String ,Integer> map = new HashMap<String, Integer>() ;
                 for(String word :words){
                     if(map.get(word)==null){  // 若不存在说明是第一次,则加入到map,出现次数为1
                         map.put(word,1);
                     }else{
                         map.put(word,map.get(word)+1);  // 若存在,次数累加1
                     }
                 }
                 // 排序
                List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
                 Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
                     public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
                      int i=left.getValue()-right.getValue();
                         if(i==0) {
                          return (right.getKey().compareTo(left.getKey()));
                         }
                         return (left.getValue().compareTo(right.getValue()));
                     }
                 };
               
                 // 集合默认升序
                 Collections.sort(list,comparator);
                 int n=list.size();
                 
                 System.out.println("一共有"+n+"个单词");
               
                 for(int i=0;i<n;i++){// 由高到低输出
                     System.out.print(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue()+"  ");
                 }
         }
         
        
    }
  • 相关阅读:
    codeforces 659F F. Polycarp and Hay(并查集+bfs)
    codeforces 659B B. Qualifying Contest(水题+sort)
    codeforces 659E E. New Reform(图论)
    codeforces 659D D. Bicycle Race(水题)
    sql_mode值的含义
    MySQL Query Cache
    Orchestrator安装
    脚本VIP更改为keepalive
    MHA软件下载地址
    MySQL中的事件调度器EVENT
  • 原文地址:https://www.cnblogs.com/g414056667/p/11805451.html
Copyright © 2020-2023  润新知