第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)
如果两个字母出现的频率一样,那么就按照字典序排列。 如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。
第1步:输出单个文件中的前 N 个最常出现的英语单词。
作用:一个用于统计文本文件中的英语单词出现频率。
单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。
英文字母:A-Z,a-z
字母数字符号:A-Z,a-z,0-9
第1步:输出单个文件中的前 N 个最常出现的英语单词。
分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词。
源程序代码:
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 TongJiDanCi { public static void main(String[] args)throws IOException//扔掉很重要 { File file = new File("D:/c1.txt"); System.out.println("0.统计英文字母个数及其百分比 1.统计英文单词个数"); Scanner sc = new Scanner(System.in); int value=sc.nextInt(); while(true) { switch(value) { case 0:txtString(file); case 1:txtString2(file); default:break; } } } /* * 统计字母 */ 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;//统计字母总数,作百分比用 while ((line=br.readLine())!=null) { char[] ch = line.toCharArray();//将字符串对象中的字符转换为一个字符数组。 total = total + ch.length; for (int i = 0; i < ch.length; i++) { ch[i] = Character.toLowerCase(ch[i]);//将大写字符转换为小写,小写字母不变 count = hm.get(ch[i]+"");//ch[i]+""的作用是加一个空格后,括号内转化为字符串 if (count == null) { count =1;//只出现一次 }else { count++; } hm.put(ch[i]+"", count); } } for (String str : hm.keySet()) {//设变量str获取键 System.out.println(str+"个数:"+hm.get(str)+" "+hm.get(str)*100.0/total+"%"); } System.out.println("总字母个数:"+total); //排序输出 List<Map.Entry<String,Integer>> list_Data = new ArrayList<Map.Entry<String,Integer>>(hm.entrySet()); Collections.sort(list_Data, new Comparator<Map.Entry<String,Integer>>(){ public int compare(Map.Entry<String,Integer> o1, Map.Entry<String,Integer> o2) { //o1 to o2升序 o2 to o1降序 return o2.getValue().compareTo(o1.getValue()); } }); System.out.println("排序输出:"); System.out.println(hm); } 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+"种单词"); System.out.println("请输入你要排序前几个单词:"); Scanner scanner=new Scanner(System.in); n=scanner.nextInt(); for(int i=0;i<n;i++){// 由高到低输出 System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue()); } } }