要求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
}
}
}