IO_课堂测试
一,用户需求
英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《飘》 中最常用的短语是什么,等等。
(1)要求1:
输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
(注:1,字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)
2,如果两个字母出现的频率一样,那么就按照字典序排列。)
思路分析:
1),创建一个char 数组ch1,存入(a-Z 52个字母)创建一个同大小的int 数组num。
2),循环:按行读取文件,遍历这行逐个字符与ch1中那个字母相等,使用ch1的下标,在num处加一,并在此记录字母总数sum。
3),按num的数据对num,ch1同步排序。
4),输出排序后的结果。
源代码:
package zimu; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; public class hao { static String str=""; static String str1="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; static char ch1 []=str1.toCharArray(); public static double num[]=new double[100]; public static int sum=0; public static void read() { Scanner scan =new Scanner(System.in); File file = new File("Harry Potter and the Sorcerer's Stone.txt"); int score = 0; StringBuffer result = new StringBuffer(); try { FileReader r = new FileReader(file); BufferedReader br = new BufferedReader(r); int i=0; str=br.readLine(); while(str!=null){ for(int j=0;j<str.length();j++) { for(int k=0;k<str1.length();k++) { if(str.charAt(j)==str1.charAt(k)) { sum++; num[k]++; } } } str=br.readLine(); } br.close(); for(int p=0;p<str1.length()-1;p++) { int o=p; for(int q=p;q<str1.length();q++) { if(num[o]<num[q]) { o=q; } } if(o!=p) { char ff=ch1[o]; ch1[o]=ch1[p]; ch1[p]=ff; double fff=num[o]; num[o]=num[p]; num[p]=fff; } } for(int k=0;k<str1.length();k++) { num[k]=num[k]/sum*100; System.out.print(ch1[k]); System.out.printf("%.2f",num[k]); System.out.println("%"); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { read(); } }
运行测试:
要求2:
输出单个文件中的前 N 个最常出现的英语单词。
(注:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。)
思路分析:
1)循环:按行读取文件,并将本行用toLowerCase()把大写改成小写,并按空格分割存进数组中。
2)对所有单词进行去重。并存到另一个数组中。
3)对所有单词进行遍历,求出每个不重复单词的个数存入int数组。
4)对int数组和单词数组同步排序。
5)输出前N个单词及其个数。
源代码:
package zimu; 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 danci { 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 length1=0; private static int nn=0; private static int j=0; static File[] list = new File("D:\java编译器").listFiles(); //private static Boolean false; public static void cun() 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=cin.readLine(); } length=j; } } public static void show() {//显示 for(int k=0;k<nn;k++) { System.out.print(c[k]+" "+b[k]+" "); System.out.printf("%.2f",(double)b[k]/length1*100); System.out.print("%"); System.out.println(""); } } public static void Sorting() {//排序 int t3=0; int t2=0; String sr=""; for(int i=0;i<length1-1;i++) { t3=i; for(int j=i+1;j<length1;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++; } } length1=tt; for(int i=0;i<length1;i++) { for(int j=0;j<length;j++) { if(c[i].equals(a[j])) { b[i]++; } } } } public static void Readfile() { File file=new File("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 main(String[] args) throws IOException { System.out.println("请输入需要统计的个数:"); nn=sc.nextInt(); a[0]=""; Readfile(); Statistics(); Sorting(); show(); } }
运行测试:
要求3(功能1):
输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。
思路分析:
1)循环:按行读取文件,并将本行用toLowerCase()把大写改成小写,并按空格分割存进数组中。
2)对所有单词进行去重。并存到另一个数组中。
3)对所有单词进行遍历,求出每个不重复单词的个数存入int数组。
4)对int数组和单词数组同步排序。
5)输出所有个单词及其个数。
源代码:
package zimu; 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 danci { 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 length1=0; private static int nn=0; private static int j=0; static File[] list = new File("D:\java编译器").listFiles(); //private static Boolean false; public static void cun() 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=cin.readLine(); } length=j; } } public static void Sorting() {//排序 int t3=0; int t2=0; String sr=""; for(int i=0;i<length1-1;i++) { t3=i; for(int j=i+1;j<length1;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++; } } length1=tt; for(int i=0;i<length1;i++) { for(int j=0;j<length;j++) { if(c[i].equals(a[j])) { b[i]++; } } } } public static void Readfile() { File file=new File("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<length1;i++){ StringBuffer sb=new StringBuffer(); out.write("这是第"+(i+1)+"个: "); double f4=(double)b[i]/length1*100; out.write(c[i]+" "+b[i]+" "+f4); out.write(" "); } out.close(); } public static void show1() { for(int k=0;k<length1;k++) { System.out.print(c[k]+" "+b[k]+" "); } }public static void main(String[] args) throws IOException { // System.out.println("请输入需要统计的个数:"); // nn=sc.nextInt(); a[0]=""; Readfile(); Statistics(); Sorting(); // show(); System.out.println("程序中所以不重复的单词!"); show1(); Writefile(); } }
运行测试
(注:!!!控制台缓存不足故存到文件中)
文件:
要求4(功能二):
指定文件目录,对目录下每一个文件执行 功能1的操作。
思路分析:
1)找出所给目录中的所有文件存入数组。
2)对所有文件名进行去重。并存到另一个数组中。
3)对所有文件名进行遍历,求出每个不重复单词的个数存入int数组。
4)对int数组和文件名数组同步排序。
5)输出所有文件名及其个数。
源代码:
package zimu; 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 danci { 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 length1=0; private static int nn=0; private static int j=0; static File[] list = new File("D:\java编译器").listFiles(); public static void Sorting() {//排序 int t3=0; int t2=0; String sr=""; for(int i=0;i<length1-1;i++) { t3=i; for(int j=i+1;j<length1;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++; } } length1=tt; for(int i=0;i<length1;i++) { for(int j=0;j<length;j++) { if(c[i].equals(a[j])) { b[i]++; } } } } public static void Readfile() { File file=new File("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 show1() { for(int k=0;k<length1;k++) { System.out.print(c[k]+" "+b[k]+" "); System.out.printf("%.2f",(double)b[k]/length1*100); System.out.print("%"); System.out.println(""); } } public static void rode1(File[] list) { for(File file : list) { if(file.isFile()) { a[length++]=file.getAbsolutePath(); } } } public static void main(String[] args) throws IOException { rode1(list); Statistics(); Sorting(); show1(); } }
运行测试:
要求5(功能三):
指定文件目录, 但是会递归遍历目录下的所有子目录,每个文件执行功能1的做操。
思路分析:
1)找出所给目录中的所有文件存入数组如果是数组再递归调用存入函数。
2)对所有文件名进行去重。并存到另一个数组中。
3)对所有文件名进行遍历,求出每个不重复单词的个数存入int数组。
4)对int数组和文件名数组同步排序。
5)输出所有文件名及其个数。
源代码:
package zimu; 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 danci { 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 length1=0; private static int nn=0; private static int j=0; static File[] list = new File("D:\java编译器").listFiles();public static void Sorting() {//排序 int t3=0; int t2=0; String sr=""; for(int i=0;i<length1-1;i++) { t3=i; for(int j=i+1;j<length1;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++; } } length1=tt; for(int i=0;i<length1;i++) { for(int j=0;j<length;j++) { if(c[i].equals(a[j])) { b[i]++; } } } } public static void Readfile() { File file=new File("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 show1() { for(int k=0;k<length1;k++) { System.out.print(c[k]+" "+b[k]+" "); System.out.printf("%.2f",(double)b[k]/length1*100); System.out.print("%"); System.out.println(""); } } public static void rode1(File[] list) { for(File file : list) { if(file.isFile()) { a[length++]=file.getAbsolutePath(); }else if(file.isDirectory()) { String str3=file.getAbsolutePath(); list = new File(str3).listFiles(); rode1(list); } } } public static void main(String[] args) throws IOException { rode1(list); Statistics(); Sorting(); show1(); } }
运行测试:
.........