Java课堂测试——输出单个文件中的前N个最常出现的英语单词
课堂测试一:输出某个英文文本文件中26字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
HarryFre.java
1 package demo05; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.text.DecimalFormat; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 public class HarryFre { 11 public static void main(String[] args)throws IOException 12 { 13 List<Integer> list=new ArrayList<>(); 14 DecimalFormat df=new DecimalFormat("######0.00"); 15 FileInputStream fip = new FileInputStream("C:\\Users\\Aming\\Desktop\\Harry Potter and the Sorcerer's Stone.txt"); 16 InputStreamReader reader = new InputStreamReader(fip, "gbk"); 17 StringBuffer sb = new StringBuffer(); 18 while (reader.ready()) { 19 sb.append((char) reader.read()); 20 } 21 reader.close(); 22 fip.close(); 23 24 int i; 25 String A=sb.toString(); 26 String M="abcdefghijklmnopqrstuvwxyz"; 27 String temp = ""; 28 char NUM[]=new char[A.length()]; 29 char Z[]=new char[26]; 30 int X[]=new int[26]; 31 int MAX=0; 32 Z=M.toCharArray(); 33 for(int k=0;k<26;k++) 34 { 35 X[k]=0; 36 for(i=0;i<A.length();i++) 37 { 38 NUM[i]=A.charAt(i); 39 if(Z[k]==NUM[i]||Z[k]==ch(NUM[i])) 40 { 41 X[k]++; 42 } 43 } 44 } 45 46 47 double sum=0; 48 for(i=0;i<25;i++) 49 for(int k=0;k<25-i;k++) 50 { 51 if(X[k]<X[k+1]) 52 { 53 int temp2=X[k]; 54 X[k]=X[k+1]; 55 X[k+1]=temp2; 56 char temp3=Z[k]; 57 Z[k]=Z[k+1]; 58 Z[k+1]=temp3; 59 } 60 } 61 for(i=0;i<26;i++) { 62 sum=sum+X[i]; 63 } 64 for(i=0;i<26;i++) 65 { 66 double jkl=(X[i])/sum*100; 67 System.out.println(Z[i]+"个数:"+X[i]+"频率为:"+df.format(jkl)+"%"); 68 } 69 70 } 71 static char ch(char c) 72 { 73 if(!(c>=97&&c<=122)) 74 c+=32; 75 return c; 76 } 77 78 }
结果:
课堂测试二:输出单个文件中的前N个最常出现的英语单词
以英文字母开头,由英文字母和字母数字符号组成的字符视为一个单词。单词以分隔符分隔且不区分大小写。在输出时,所有单词都用小写字符表示。
HarryPro.java
1 package demo05; 2 3 import java.io.*; 4 import java.util.*; 5 import java.util.Map.Entry; 6 7 public class HarryPo 8 { 9 public static int n=0; 10 public static void main(String[] args) { 11 Scanner input=new Scanner(System.in); 12 String s; 13 int count=0; 14 int num=1; 15 //作为FileReader和FileWriter读取的对象 16 String file1="C:\\Users\\Aming\\Desktop\\Harry Potter and the Sorcerer's Stone.txt"; 17 String file2="C:\\Users\\Aming\\Desktop\\re.txt"; 18 try 19 { 20 BufferedReader a=new BufferedReader(new FileReader(file1)); 21 BufferedWriter b=new BufferedWriter(new FileWriter(file2)); 22 StringBuffer c=new StringBuffer(); 23 //将文件内容存入StringBuffer中 24 while((s = a.readLine()) != null) 25 { 26 //用于拼接字符串 27 c.append(s); 28 } 29 //将StringBuffer转换成String,然后再将所有字符转化成小写字符 30 String m=c.toString().toLowerCase(); 31 //匹配由数字和26个字母组成的字符串 32 String [] d=m.split("[^a-zA-Z0-9]+"); 33 //遍历数组将其存入Map<String, Integer>中 34 Map<String , Integer> myTreeMap=new TreeMap<String, Integer>(); 35 for(int i = 0; i < d.length; i++) { 36 //containsKey()方法用于检查特定键是否在TreeMap中映射 37 if(myTreeMap.containsKey(d[i])) { 38 count = myTreeMap.get(d[i]); 39 myTreeMap.put(d[i], count + 1); 40 } 41 else { 42 myTreeMap.put(d[i], 1); 43 } 44 } 45 //通过比较器实现排序 46 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(myTreeMap.entrySet()); 47 //按降序排序 48 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 49 50 public int compare(Entry<String, Integer> k1, Entry<String, Integer> k2) { 51 //返回两个单词出现次数较多的那个单词的出现次数 52 return k2.getValue().compareTo(k1.getValue()); 53 } 54 55 }); 56 System.out.println("请输入要输出前N名的N:"); 57 n=input.nextInt(); 58 for(Map.Entry<String, Integer> map : list) { 59 if(num <= n) { 60 //按内容输出到指定文件中去 61 b.write("出现次数第" + num + "的单词为:" + map.getKey() + ",出现频率为" + map.getValue() + "次"); 62 b.newLine(); 63 System.out.println(map.getKey() + ":" + map.getValue()); 64 num++; 65 } 66 else break; 67 } 68 a.close(); 69 b.close(); 70 } 71 catch(FileNotFoundException e) 72 { 73 System.out.println("找不到指定文件"); 74 } 75 catch(IOException e) 76 { 77 System.out.println("文件读取错误"); 78 } 79 System.out.println("输出完成"); 80 } 81 }
结果:
课堂测试三:要求同二
功能1:输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。
功能2:指定文件目录,对目录下的每一个文件执行功能1的操作。
功能3:指定文件目录,但是会递归遍历目录下的所有子目录,每个文件执行功能1的操作。
功能1:
HHHarry.java
1 package demo05; 2 3 import java.io.*; 4 import java.util.*; 5 import java.util.Map.Entry; 6 7 public class HHHarry 8 { 9 public static int n=0; 10 public static void main(String[] args) { 11 Scanner input=new Scanner(System.in); 12 String s; 13 int count=0; 14 int num=1; 15 //作为FileReader和FileWriter读取的对象 16 String file1="C:\\Users\\Aming\\Desktop\\Harry Potter and the Sorcerer's Stone.txt"; 17 String file2="C:\\Users\\Aming\\Desktop\\re1.txt"; 18 try 19 { 20 BufferedReader a=new BufferedReader(new FileReader(file1)); 21 BufferedWriter b=new BufferedWriter(new FileWriter(file2)); 22 StringBuffer c=new StringBuffer(); 23 //将文件内容存入StringBuffer中 24 while((s = a.readLine()) != null) 25 { 26 //用于拼接字符串 27 c.append(s); 28 } 29 //将StringBuffer转换成String,然后再将所有字符转化成小写字符 30 String m=c.toString().toLowerCase(); 31 //匹配由数字和26个字母组成的字符串 32 String [] d=m.split("[^a-zA-Z0-9]+"); 33 //遍历数组将其存入Map<String, Integer>中 34 Map<String , Integer> myTreeMap=new TreeMap<String, Integer>(); 35 for(int i = 0; i < d.length; i++) { 36 //containsKey()方法用于检查特定键是否在TreeMap中映射 37 if(myTreeMap.containsKey(d[i])) { 38 count = myTreeMap.get(d[i]); 39 myTreeMap.put(d[i], count + 1); 40 } 41 else { 42 myTreeMap.put(d[i], 1); 43 } 44 } 45 //通过比较器实现排序 46 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(myTreeMap.entrySet()); 47 //按降序排序 48 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 49 50 public int compare(Entry<String, Integer> k1, Entry<String, Integer> k2) { 51 //返回两个单词出现次数较多的那个单词的出现次数 52 return k2.getValue().compareTo(k1.getValue()); 53 } 54 55 }); 56 57 58 for(Map.Entry<String, Integer> map : list) { 59 if(true) { 60 //按内容输出到指定文件中去 61 b.write("出现次数第" + num + "的单词为:" + map.getKey() + ",出现频率为" + map.getValue() + "次"); 62 b.newLine(); 63 System.out.println(map.getKey() + ":" + map.getValue()); 64 num++; 65 } 66 else break; 67 } 68 a.close(); 69 b.close(); 70 } 71 catch(FileNotFoundException e) 72 { 73 System.out.println("找不到指定文件"); 74 } 75 catch(IOException e) 76 { 77 System.out.println("文件读取错误"); 78 } 79 System.out.println("输出完成"); 80 } 81 }
结果: