要求1:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)
如果两个字母出现的频率一样,那么就按照字典序排列。
实验思路:利用每个字母的阿斯克码值不同来记录每个字母。定义一个二维数组,字母区分大小写一个52个,定义一个二维数组a[52][2]。用来存字母的阿斯克码值,另一个用来存其对应字母的个数。
最后进行倒叙排序,求出其百分比,并保留两位小数。
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.lang.reflect.Array; import java.nio.channels.NonWritableChannelException; import java.text.DecimalFormat; import java.util.Scanner; public class Hlbt { static double a[][]=new double [52][2]; static int number; public static void main(String[] args) { File file= new File("Harry Potter and the Sorcerer's Stone.txt"); FileReader fr=null; BufferedReader br=null; try { fr=new FileReader(file); br=new BufferedReader(fr); String str=null; while((str=br.readLine())!=null) { //System.out.println(str); char [] c=str.toCharArray(); //String b[]=new String[10000]; for(int i=0;i<str.length();i++) { int x=Integer.valueOf(c[i]); if(x>=65&&x<=90) { a[x-65][1]++; number++; } else if(x>=97&&x<=122) { a[x-97+26][1]++; number++; } } } for(int j=0;j<52;j++) { if(j<26) a[j][0]=j+65; else a[j][0]=j+97-26; } for (int i = 0; i<51; i++) for (int j = 0; j < 51- i; j++) { if (a[j][1] < a[j + 1][1]) { double temp = a[j][1]; a[j][1]= a[j + 1][1]; a[j + 1][1] = temp; double m = a[j][0]; a[j][0]= a[j + 1][0]; a[j + 1][0] = m; } } for (int j=0;j<52;j++) { double b=a[j][1]/number*100; DecimalFormat df = new DecimalFormat("#.00"); System.out.println((char)(int)a[j][0]+":"+df.format(b)+"%"); } } catch (Exception e) { // TODO: handle exception } } }