1.输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)
如果两个字母出现的频率一样,那么就按照字典序排列。
思路:(1)读取文件,然后每个字符都记录;
(2)声明数组time[]用来记录每个字母出现的次数。
(3)声明sum用来记录字母出现的总次数
(4)数组rate[]用来记录每个字母的出现率
(5)对rate[]进行排序。
代码:
package test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.math.BigDecimal; import java.math.RoundingMode; public class Calculating { public static void main(String[] args) { File f = new File("C:\\Users\\lenovo\\Desktop\\Harry Potter and the Sorcerer's Stone.txt"); Reader reader; int time [] = new int [52];//记录每个字母出现的次数 for(int i=0;i<52;i++)//将每个字母的次数初始化为0 { time[i]=0; } try{ reader = new InputStreamReader(new FileInputStream(f)); int tempchar; while ((tempchar = reader.read()) != -1) { //是不是字母的条件如果是则执行自增操作 if(((tempchar>96)&&((tempchar<123)))) { time[tempchar-97]++; } if(((tempchar)>64)&&((tempchar<91))) { time[tempchar-39]++; } } reader.close();//关闭 int sum=0;//所有字母的总数 for(int i=0;i<52;i++)//计算字母的总出现次数 { sum+=time[i]; } double rate [] = new double [52];//存储每个字母出现次数所占总次数的比率 for(int i=0;i<52;i++)//计算每个字母出现率 { rate[i] = new BigDecimal(time[i]).divide(new BigDecimal(sum),4,RoundingMode.HALF_EVEN).doubleValue()*100;//格式化 } String result [] = new String [52];//存储每个字母的出现次数和出现率 for(int i=0;i<52;i++) { result[i] = "字母"+(char)(i>26?i+38:i+97)+"出现了"+time[i]+"次,"+"出现的频率为"+rate[i]+"%"; } String str; int ti; for(int i=0;i<52;i++)//对rate[]排序 { for(int j=i+1;j<52;j++) { if(time[i]<time[j]) { ti=time[i]; time[i]=time[j]; time[j]=ti; str=result[i]; result[i]=result[j]; result[j]=str; } } } for(int i=0;i<52;i++) { System.out.println(result[i]);//输出排序后的结果 } } catch (IOException e) { e.printStackTrace(); return; } } }
运行结果:
体会:刚开始不会做,便参考了代码,但是要求和上课的也不完全一样,上课的是区分大小写,而参考的不是,看到了两个if()判断我也没有多想就把两个if给改了让大写的存在0-25,小写的存在26-51,这样存的话虽然结果对,但是字母却对不上,也就是说原本e的出现率是12%,可是输出却成了d的频率,因此在后面我花费了大量的时间来处理这个问题,直到验收完我才想到可以直接一个if就完事了,但是我没有改成一个if,我想让自己记住这个教训,其实编程不只是手上的活儿,更是脑子上的活儿,要先想好,这样后面才能一帆风顺。
2.输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文本文件中的英语单词出现频率的控制台程序;单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。
思路:(1)将单词转化为小写并且存入数组;
(2)然后去重,并执行自增操作
(3)读取文件
(4)格式化输出
代码:
package test; import java.io.File; import java.io.InputStreamReader; import java.io.Reader; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.Scanner; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class WordCounting { private static String str=""; private static Scanner sc=new Scanner(System.in); private static BufferedReader br=null; private static String a[]=new String[1000000]; private static String c[]=new String[10000000]; private static int b[]=new int[1000000]; private static int length=0; private static int l=0; private static int n=0; private static int j=0; public static void storage() throws IOException {//将单词存到数组a { while(str!=null) { int i=0; str=str.toLowerCase(); //将大写改为小写 for(i=0;i<str.length();i++) { if((str.charAt(i)>96&&str.charAt(i)<123)) {//判断是否为字母 a[j]=a[j]+str.charAt(i); } if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.') {//一个单词结尾的条件空格,或者句号,或者逗号 if(!a[j].equals("")) {//不为空 j=j+1; a[j]=""; } } } str=br.readLine();//读取新的一行内容 } length=j; } } public static void show() {//显示 for(int k=0;k<n;k++) { System.out.print(c[k]+"\t"+b[k]+" "); System.out.printf("%.2f",(double)b[k]/l*100);//格式化的输出 System.out.print("%");//输出百分号 System.out.println(""); } } public static void Sorting() {//排序 int t3=0; int t2=0; String sr=""; for(int i=0;i<l-1;i++) { t3=i; for(int j=i+1;j<l;j++) { if(b[t3]<b[j]) { t3=j; } } if(t3!=i) { t2=b[i]; b[i]=b[t3]; b[t3]=t2; sr=c[i]; c[i]=c[t3]; c[t3]=sr; } } } public static void deleteOverlap(){//去重 for(int k=0;k<length;k++) { b[k]=0; } c[0]=a[0]; int tt=1; Boolean rt=true; for(int i=1;i<length;i++) { rt=false; for(int j=0;j<tt;j++) { if(a[i].equals(c[j])) { rt=true; break; } } if(!rt) { c[tt]=a[i]; tt++; } } l=tt; for(int i=0;i<l;i++) { for(int j=0;j<length;j++) { if(c[i].equals(a[j])) { b[i]++; } } } } public static void Readfile() {//读取文件 File file=new File("C:\\Users\\lenovo\\Desktop\\Harry Potter and the Sorcerer's Stone.txt"); try { InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8"); br=new BufferedReader(read); str=br.readLine(); storage(); br.close(); read.close(); } catch(IOException e) { System.out.println("读取失败!"); e.printStackTrace(); } } public static void main(String[] args) throws IOException { System.out.println("请输入需要统计的个数:"); n=sc.nextInt(); a[0]=""; Readfile(); deleteOverlap(); Sorting(); show(); } }package test; import java.io.File; import java.io.InputStreamReader; import java.io.Reader; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.Scanner; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class WordCounting { private static String str=""; private static Scanner sc=new Scanner(System.in); private static BufferedReader br=null; private static String a[]=new String[1000000]; private static String c[]=new String[10000000]; private static int b[]=new int[1000000]; private static int length=0; private static int l=0; private static int n=0; private static int j=0; public static void storage() throws IOException {//将单词存到数组a { while(str!=null) { int i=0; str=str.toLowerCase(); //将大写改为小写 for(i=0;i<str.length();i++) { if((str.charAt(i)>96&&str.charAt(i)<123)) {//判断是否为字母 a[j]=a[j]+str.charAt(i); } if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.') {//一个单词结尾的条件空格,或者句号,或者逗号 if(!a[j].equals("")) {//不为空 j=j+1; a[j]=""; } } } str=br.readLine();//读取新的一行内容 } length=j; } } public static void show() {//显示 for(int k=0;k<n;k++) { System.out.print(c[k]+"\t"+b[k]+" "); System.out.printf("%.2f",(double)b[k]/l*100);//格式化的输出 System.out.print("%");//输出百分号 System.out.println(""); } } public static void Sorting() {//排序 int t3=0; int t2=0; String sr=""; for(int i=0;i<l-1;i++) { t3=i; for(int j=i+1;j<l;j++) { if(b[t3]<b[j]) { t3=j; } } if(t3!=i) { t2=b[i]; b[i]=b[t3]; b[t3]=t2; sr=c[i]; c[i]=c[t3]; c[t3]=sr; } } } public static void deleteOverlap(){//去重 for(int k=0;k<length;k++) { b[k]=0; } c[0]=a[0]; int tt=1; Boolean rt=true; for(int i=1;i<length;i++) { rt=false; for(int j=0;j<tt;j++) { if(a[i].equals(c[j])) { rt=true; break; } } if(!rt) { c[tt]=a[i]; tt++; } } l=tt; for(int i=0;i<l;i++) { for(int j=0;j<length;j++) { if(c[i].equals(a[j])) { b[i]++; } } } } public static void Readfile() {//读取文件 File file=new File("C:\\Users\\lenovo\\Desktop\\Harry Potter and the Sorcerer's Stone.txt"); try { InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8"); br=new BufferedReader(read); str=br.readLine(); storage(); br.close(); read.close(); } catch(IOException e) { System.out.println("读取失败!"); e.printStackTrace(); } } public static void main(String[] args) throws IOException { System.out.println("请输入需要统计的个数:"); n=sc.nextInt(); a[0]=""; Readfile(); deleteOverlap(); Sorting(); show(); } }
运行截图:
体会:之前用的是大数类的除法,但是还有标准化的暑促胡,语法与c语言类似,在下篇文章总加以介绍。
3.输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。
思路:(1)与之前的一样,存储到数组中,然后都输出
(2)将结果输出到文件中。
package test; import java.io.File; import java.io.InputStreamReader; import java.io.Reader; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.Scanner; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class UnqueWord { private static String str=""; private static Scanner sc=new Scanner(System.in); private static BufferedReader cin=null; private static String a[]=new String[1000000]; private static String c[]=new String[10000000]; private static int b[]=new int[1000000]; private static int length=0; private static int l=0; private static int nn=0; private static int j=0; public static void cun() throws IOException {//将单词存到数组 { while(str!=null) { int i=0; str=str.toLowerCase(); //把大写改成小写 for(i=0;i<str.length();i++) { if((str.charAt(i)>96&&str.charAt(i)<123)) { a[j]=a[j]+str.charAt(i); } if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.') { if(!a[j].equals("")) { j=j+1; a[j]=""; } } } str=cin.readLine(); } length=j; } } public static void Sorting() {//排序 int t3=0; int t2=0; String sr=""; for(int i=0;i<l-1;i++) { t3=i; for(int j=i+1;j<l;j++) { if(b[t3]<b[j]) { t3=j; } } if(t3!=i) { t2=b[i]; b[i]=b[t3]; b[t3]=t2; sr=c[i]; c[i]=c[t3]; c[t3]=sr; } } } public static void Statistics(){//去重 for(int k=0;k<length;k++) { b[k]=0; } c[0]=a[0]; int tt=1; Boolean rt=true; for(int i=1;i<length;i++) { rt=false; for(int j=0;j<tt;j++) { if(a[i].equals(c[j])) { rt=true; break; } } if(!rt) { c[tt]=a[i]; tt++; } } l=tt; for(int i=0;i<l;i++) { for(int j=0;j<length;j++) { if(c[i].equals(a[j])) { b[i]++; } } } } public static void Readfile() {//读取文件 File file=new File("C:\\Users\\lenovo\\Desktop\\Harry Potter and the Sorcerer's Stone.txt"); try { InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8"); cin=new BufferedReader(read); str=cin.readLine(); cun(); cin.close(); read.close(); } catch(IOException e) { System.out.println("读取失败!"); e.printStackTrace(); } } public static void Writefile() throws IOException { File file=new File("t1.txt"); if(!file.exists()) file.createNewFile(); FileWriter write = new FileWriter(file,true); BufferedWriter out=new BufferedWriter(write); for(int i=0;i<l;i++){ StringBuffer sb=new StringBuffer(); out.write("这是第"+(i+1)+"个: "); double f4=(double)b[i]/l*100; out.write(c[i]+"\t"+b[i]+"\t"+f4); out.write("\r\n"); } out.close(); } public static void show1() { for(int k=0;k<l;k++) { System.out.print(c[k]+"\t \t\t"+b[k]+"\n"); } }public static void main(String[] args) throws IOException { a[0]=""; Readfile(); Statistics(); Sorting(); System.out.println("程序中不重复的单词!"); show1(); Writefile(); } }
运行结果: