要求1:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
要求2:输出单个文件中的前 N 个最常出现的英语单词。 作用:一个用于统计文本文件中的英语单词出现频率的控制台程序; 单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。
要求3:输出单个文件中的前 N 个最常出现的英语单词。 英文字母:A-Z,a-z 字母数字符号:A-Z,a-z,0-9 分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词
package hlbt;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class hlbt1 {
private static int[][] letter=new int[2][52];
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
File directory = new File("");//参数为空
String courseFile = directory.getCanonicalPath()+"/Harry Potter and the Sorcerer's Stone.txt";
BufferedReader bf = new BufferedReader(new FileReader(courseFile));
String content = null;
while((content = bf.readLine()) != null){
sb.append(content.trim());
}
for(int j=0;j<52;j++)
{
letter[0][j]=j;
letter[1][j]=0;
}
countCracts(sb.toString(), 'a', 'z');
countCracts(sb.toString(), 'A', 'Z');
for(int i=0;i<52;i++)
{
int max=letter[1][i],idmax=i;
for(int j=i+1;j<52;j++)
{
if(max<letter[1][j])
{
max=letter[1][j];
idmax=j;
}
}
int k,t;
k=letter[1][i];
letter[1][i]=letter[1][idmax];
letter[1][idmax]=k;
t=letter[0][i];
letter[0][i]=letter[0][idmax];
letter[0][idmax]=t;
}
double m=0;
for(int i=0;i<52;i++)
{
m+=letter[1][i];
}
for(int i=0;i<52;i++)
{
switch(letter[0][i])
{
case 0:System.out.print("A:");break;
case 1:System.out.print("B:");break;
case 2:System.out.print("C:");break;
case 3:System.out.print("D:");break;
case 4:System.out.print("E:");break;
case 5:System.out.print("F:");break;
case 6:System.out.print("G:");break;
case 7:System.out.print("H:");break;
case 8:System.out.print("I:");break;
case 9:System.out.print("J:");break;
case 10:System.out.print("K:");break;
case 11:System.out.print("L:");break;
case 12:System.out.print("M:");break;
case 13:System.out.print("N:");break;
case 14:System.out.print("O:");break;
case 15:System.out.print("P:");break;
case 16:System.out.print("Q:");break;
case 17:System.out.print("R:");break;
case 18:System.out.print("S:");break;
case 19:System.out.print("T:");break;
case 20:System.out.print("U:");break;
case 21:System.out.print("V:");break;
case 22:System.out.print("W:");break;
case 23:System.out.print("X:");break;
case 24:System.out.print("Y:");break;
case 25:System.out.print("Z:");break;
case 26:System.out.print("a:");break;
case 27:System.out.print("b:");break;
case 28:System.out.print("c:");break;
case 29:System.out.print("d:");break;
case 30:System.out.print("e:");break;
case 31:System.out.print("f:");break;
case 32:System.out.print("g:");break;
case 33:System.out.print("h:");break;
case 34:System.out.print("i:");break;
case 35:System.out.print("j:");break;
case 36:System.out.print("k:");break;
case 37:System.out.print("l:");break;
case 38:System.out.print("m:");break;
case 39:System.out.print("n:");break;
case 40:System.out.print("o:");break;
case 41:System.out.print("p:");break;
case 42:System.out.print("q:");break;
case 43:System.out.print("r:");break;
case 44:System.out.print("s:");break;
case 45:System.out.print("t:");break;
case 46:System.out.print("u:");break;
case 47:System.out.print("v:");break;
case 48:System.out.print("w:");break;
case 49:System.out.print("x:");break;
case 50:System.out.print("y:");break;
case 51:System.out.print("z:");break;
}
System.out.println(String.format("%.2f",(double)(letter[1][i]/m*100))+"%");
}
}
private static void countCracts(String str, char start, char end) {
for(char a = start; a <= end; a++){
int cractCount = str.length() - str.replaceAll(String.valueOf(a), "").length();
if(a>='A'&&a<='Z')
{
int m=(int)(a-'A'+1);
switch(m)
{
case 1:letter[1][0]=cractCount;break;
case 2:letter[1][1]=cractCount;break;
case 3:letter[1][2]=cractCount;break;
case 4:letter[1][3]=cractCount;break;
case 5:letter[1][4]=cractCount;break;
case 6:letter[1][5]=cractCount;break;
case 7:letter[1][6]=cractCount;break;
case 8:letter[1][7]=cractCount;break;
case 9:letter[1][8]=cractCount;break;
case 10:letter[1][9]=cractCount;break;
case 11:letter[1][10]=cractCount;break;
case 12:letter[1][11]=cractCount;break;
case 13:letter[1][12]=cractCount;break;
case 14:letter[1][13]=cractCount;break;
case 15:letter[1][14]=cractCount;break;
case 16:letter[1][15]=cractCount;break;
case 17:letter[1][16]=cractCount;break;
case 18:letter[1][17]=cractCount;break;
case 19:letter[1][18]=cractCount;break;
case 20:letter[1][19]=cractCount;break;
case 21:letter[1][20]=cractCount;break;
case 22:letter[1][21]=cractCount;break;
case 23:letter[1][22]=cractCount;break;
case 24:letter[1][23]=cractCount;break;
case 25:letter[1][24]=cractCount;break;
case 26:letter[1][25]=cractCount;break;
}
}
if(a>='a'&&a<='z')
{
int m=(int)(a-'a'+1);
switch(m)
{
case 1:letter[1][26]=cractCount;break;
case 2:letter[1][27]=cractCount;break;
case 3:letter[1][28]=cractCount;break;
case 4:letter[1][29]=cractCount;break;
case 5:letter[1][30]=cractCount;break;
case 6:letter[1][31]=cractCount;break;
case 7:letter[1][32]=cractCount;break;
case 8:letter[1][33]=cractCount;break;
case 9:letter[1][34]=cractCount;break;
case 10:letter[1][35]=cractCount;break;
case 11:letter[1][36]=cractCount;break;
case 12:letter[1][37]=cractCount;break;
case 13:letter[1][38]=cractCount;break;
case 14:letter[1][39]=cractCount;break;
case 15:letter[1][40]=cractCount;break;
case 16:letter[1][41]=cractCount;break;
case 17:letter[1][42]=cractCount;break;
case 18:letter[1][43]=cractCount;break;
case 19:letter[1][44]=cractCount;break;
case 20:letter[1][45]=cractCount;break;
case 21:letter[1][46]=cractCount;break;
case 22:letter[1][47]=cractCount;break;
case 23:letter[1][48]=cractCount;break;
case 24:letter[1][49]=cractCount;break;
case 25:letter[1][50]=cractCount;break;
case 26:letter[1][51]=cractCount;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());
}
}