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 }

结果:

扫描二维码关注公众号,回复: 7755339 查看本文章

课堂测试二:输出单个文件中的前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 }

结果:

 

 

 

猜你喜欢

转载自www.cnblogs.com/Aming-/p/11800353.html