入
一,用户需求
英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?。
(1)要求1:
输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
(注:1,字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)
2,如果两个字母出现的频率一样,那么就按照字典序排列。)
思路分析:
1),首先创建一个数组char为存52个字母
2),然后每行读取文件中的内容分别调用函数统计其实什么字母
3),函数内的方法为直接取出空格分为每个单词然后统计其为何种类型然后用用m为数组b[i]中的字母强制类型转换-64或者-70位整型在相应的位置1到52存入数据次数++;
源代码:
package test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; public class test2 { static String a=new String(); static String b[]=new String[100000]; static String c[]=new String[10000000]; static int n=0; static int d[]=new int[10000000]; public static void main(String[] args) { try { String pathname = "E:\2019秋季学期\java\Harry Potter and the Sorcerer's Stone.txt"; File filename = new File(pathname); InputStreamReader reader = new InputStreamReader( new FileInputStream(filename)); // ����һ������������reader BufferedReader br = new BufferedReader(reader); // ����һ�����������ļ�����ת�ɼ�����ܶ��������� String line = ""; int i=0; for(i=0;i<=52;i++) { d[i]=0; } line = br.readLine(); while (line != null) { a=line; zimu(a); line = br.readLine(); } } catch (Exception e) { e.printStackTrace(); } sort(); } public static void sort() { char q='A'; char p='a'; int sum=0; for(int i = 1;i<=52;i++) { sum=d[i]+sum; } char k='A'; char f[]=new char[53]; for(int i=1;i<=52;i++) {if(i==27) { k='a'; f[i]=k; } f[i]=k; k++; } int n=0; k='a'; for(int i=1;i<=52;i++) {for(int j=i+1;j<52;j++) {if(d[i]<d[j]) { n=d[i]; d[i]=d[j]; d[j]=n; k=f[i]; f[i]=f[j]; f[j]=k; } } } for( int i=1;i<=52;i++) {System.out.print(f[i]+"概率"); System.out.printf("%.2f",d[i]*1.0/sum*100); System.out.println("%"); } } public static void zimu(String a) {String b[]=a.split("\s+"); int i,j; int m; m=0; for(i=0;i<b.length;i++) { for(j=0;j<b[i].length();j++) { if((b[i].charAt(j)>=65&&b[i].charAt(j)<=90)||(b[i].charAt(j)>=97&&b[i].charAt(j)<=122)) { if((b[i].charAt(j)>=65&&b[i].charAt(j)<=90)) { m=(int)(b[i].charAt(j))-64;} if(b[i].charAt(j)>=97&&b[i].charAt(j)<=122) { m=(int)(b[i].charAt(j))-70; } d[m]++; } else { continue; } } } }
实验结果:
要求2:
输出单个文件中的前 N 个最常出现的英语单词。
(注:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。)
思路:
1、同理每行读取内容
2、首先使用StringTokenizer方法将String内的所有所有符号包括空格都出掉只有了单词
3 用同位置数组保证每个位置遇见相同的然后不添加然后数据++
4运用快排排序
源代码
package test; import java.io.File; import java.io.InputStreamReader; import java.util.Scanner; import java.util.StringTokenizer; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; public class test3 { static int num=0,a=0; static String word[]=new String[1000000]; static int wordnum[]=new int[1000000]; public static void main(String args[]) { Scanner scanner = new Scanner(System.in); try{ String path = "E:\2019秋季学期\java\Harry Potter and the Sorcerer's Stone.txt"; File file = new File(path); InputStreamReader reader = new InputStreamReader(new FileInputStream(file)); BufferedReader br = new BufferedReader(new FileReader(file)); File file2 = new File("wenijan.txt"); file2.createNewFile(); BufferedWriter out = new BufferedWriter(new FileWriter(file2)); String s=""; s=br.readLine(); while(s!=null) { s=s.toLowerCase();// 大写转小写 StringTokenizer st = new StringTokenizer(s," ".,?;! :“”‘: "); while(st.hasMoreElements()) { String str =(String)st.nextElement(); for(int j=0;j<num;j++) { if(str.equals(word[j])) { wordnum[j]++; }else a++; } if(a==num) { word[num]=str; wordnum[num]++; num++; } a=0; } s=br.readLine(); } for(int i=0;i<num;i++) { for(int j=i+1;j<num;j++) { if(wordnum[j]>wordnum[i]) { int temp=wordnum[i]; wordnum[i]=wordnum[j]; wordnum[j]=temp; String Temp=word[i]; word[i]=word[j]; word[j]=Temp; } } } int m=scanner.nextInt(); for(int i=0;i<num;i++) { System.out.println(word[i]+" "+wordnum[i]); } }catch(Exception e){ e.printStackTrace(); } } }
运行结果
要求3(功能1):
输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。
思路分析:
1、同理每行读取内容
2、首先使用StringTokenizer方法将String内的所有所有符号包括空格都出掉只有了单词
3 用同位置数组保证每个位置遇见相同的然后不添加然后数据++
4运用快排排序
源代码
package test; import java.io.File; import java.io.InputStreamReader; import java.util.Scanner; import java.util.StringTokenizer; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; public class test3 { static int num=0,a=0; static String word[]=new String[1000000]; static int wordnum[]=new int[1000000]; public static void main(String args[]) { Scanner scanner = new Scanner(System.in); try{ String path = "E:\2019秋季学期\java\Harry Potter and the Sorcerer's Stone.txt"; File file = new File(path); InputStreamReader reader = new InputStreamReader(new FileInputStream(file)); BufferedReader br = new BufferedReader(new FileReader(file)); File file2 = new File("wenijan.txt"); file2.createNewFile(); BufferedWriter out = new BufferedWriter(new FileWriter(file2)); String s=""; s=br.readLine(); while(s!=null) { s=s.toLowerCase();// 大写转小写 StringTokenizer st = new StringTokenizer(s," ".,?;! :“”‘: "); while(st.hasMoreElements()) { String str =(String)st.nextElement(); for(int j=0;j<num;j++) { if(str.equals(word[j])) { wordnum[j]++; }else a++; } if(a==num) { word[num]=str; wordnum[num]++; num++; } a=0; } s=br.readLine(); } for(int i=0;i<num;i++) { for(int j=i+1;j<num;j++) { if(wordnum[j]>wordnum[i]) { int temp=wordnum[i]; wordnum[i]=wordnum[j]; wordnum[j]=temp; String Temp=word[i]; word[i]=word[j]; word[j]=Temp; } } } int m=scanner.nextInt(); for(int i=0;i<num;i++) { System.out.println(word[i]+" "+wordnum[i]); } }catch(Exception e){ e.printStackTrace(); } } }
运行结果
要求4(功能二):
指定文件目录,对目录下每一个文件执行 功能1的操作。
思路分析:
1)找出所给目录中的所有文件存入数组。
2、放入文件数组中然后调用for循环挨个输出其文件内容
3调用judge函数判断是否为文件或者文件夹然后递归调用
源代码
package test; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; public class test4{ private static String str1; private static String[] str3 = new String[20000]; private static int[] n=new int[20000]; public static void main(String[] args) throws IOException { Scanner sc=new Scanner(System.in); File file = new File("E:\2019秋季学期\java\1"); // File file = new File("src/Harry Potter and the Sorcerer's Stone.txt"); File[] fileList = file.listFiles(); List<File> myfiles = new ArrayList<File>(); for (int filenum = 0; filenum < fileList.length; filenum++) { if (fileList[filenum].isFile()) {//判断是否为文件 String tempstr=null; BufferedReader reader = null; reader = new BufferedReader(new FileReader(fileList[filenum])); int i=0,sum=0,j=0; while((tempstr=reader.readLine())!=null) { StringTokenizer st = new StringTokenizer(tempstr,", .?":!);-- "); while(st.hasMoreElements()) { str1=(String)st.nextElement(); str1=str1.toLowerCase(); for(i=0;i<=sum;i++) { if(str1.equals(str3[i])) { n[i]++; break;} } if(i>sum) { str3[sum]=str1; n[sum]=1; sum++; } } } for( i=0;i<sum;i++) { for( j=i+1;j<sum;j++) { if(n[j]>n[i]) { int temp=n[i]; n[i]=n[j]; n[j]=temp; String Temp=str3[i]; str3[i]=str3[j]; str3[j]=Temp; } } } i=0; double sum1=0; while(n[i]!=0) { sum1+=n[i]; i++; } i=0; System.out.println("总数为:"+sum1); while(n[i]!=0) { System.out.print(str3[i]+" "+n[i]+" "); System.out.printf("%.2f ",n[i]/sum1*100); i++; } System.out.println(); System.out.println(); // System.out.print("你要前几个最多的单词:"); // int choose = sc.nextInt(); // for(i=0;i<choose;i++) { // System.out.printf(str3[i]+" "+n[i]+" "); // System.out.printf("%.2f ",n[i]/sum1*100); // } } }
}
}
运行结果
要求5(功能三):
指定文件目录, 但是会递归遍历目录下的所有子目录,每个文件执行功能1的做操。
思路分析:
1
package test; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; public class test4{ private static String str1; private static String[] str3 = new String[20000]; private static int[] n=new int[20000]; public static void main(String[] args) throws IOException { Scanner sc=new Scanner(System.in); File file = new File("E:\2019秋季学期\java\1"); // File file = new File("src/Harry Potter and the Sorcerer's Stone.txt"); File[] fileList = file.listFiles(); List<File> myfiles = new ArrayList<File>(); for (int filenum = 0; filenum < fileList.length; filenum++) { if (fileList[filenum].isFile()) {//判断是否为文件 String tempstr=null; BufferedReader reader = null; reader = new BufferedReader(new FileReader(fileList[filenum])); int i=0,sum=0,j=0; while((tempstr=reader.readLine())!=null) { StringTokenizer st = new StringTokenizer(tempstr,", .?":!);-- "); while(st.hasMoreElements()) { str1=(String)st.nextElement(); str1=str1.toLowerCase(); for(i=0;i<=sum;i++) { if(str1.equals(str3[i])) { n[i]++; break;} } if(i>sum) { str3[sum]=str1; n[sum]=1; sum++; } } } for( i=0;i<sum;i++) { for( j=i+1;j<sum;j++) { if(n[j]>n[i]) { int temp=n[i]; n[i]=n[j]; n[j]=temp; String Temp=str3[i]; str3[i]=str3[j]; str3[j]=Temp; } } } i=0; double sum1=0; while(n[i]!=0) { sum1+=n[i]; i++; } i=0; System.out.println("总数为:"+sum1); while(n[i]!=0) { System.out.print(str3[i]+" "+n[i]+" "); System.out.printf("%.2f ",n[i]/sum1*100); i++; } System.out.println(); System.out.println(); // System.out.print("你要前几个最多的单词:"); // int choose = sc.nextInt(); // for(i=0;i<choose;i++) { // System.out.printf(str3[i]+" "+n[i]+" "); // System.out.printf("%.2f ",n[i]/sum1*100); // } } } } }
运行结果