码迷,mamicode.com
首页 > 其他好文 > 详细

课堂测试

时间:2019-11-05 21:34:24      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:代码   cas   文件   null   line   就是   转换   遍历   stack   

 

 

要求:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。

功能1:输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。

功能2: 指定文件目录,对目录下每一个文件执行统计的操作。 

功能3:指定文件目录,是会递归遍历目录下的所有子目录的文件进行统计单词的功能。

功能4:输出出现次数最多的前 n 个单词,  例如, 提示统计统计前多少名:输入10。 就是输出最常出现单词的前 10 名。 当没有指明数量的时候,我们默认列出所有单词的频率。

源代码:

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()+"  ");
             }
     }         
}

用简单的文件读取,将字节转换为字母,并通过ASCII码将读取出来的大写字母变为小写字母,最后再排序

最后运用HashMap类,键存放单词,只存放出现的次数。

课堂测试

标签:代码   cas   文件   null   line   就是   转换   遍历   stack   

原文地址:https://www.cnblogs.com/shenaoyu/p/11801536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!