课堂练习----单词统计

  用户需求:

英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《哈利波特》 中最常用的短语是什么,等等。我们就写一些程序来解决这个问题,满足一下我们的好奇心。

  第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。字母频率 = 这个字母出现的次数 / (所有A-Za-z字母出现的总数)如果两个字母出现的频率一样,那么就按照字典序排列。  如果 S T 出现频率都是 10.21%, 那么, S 要排在T 的前面。

  第1步:输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文本文件中的英语单词出现频率。单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。英文字母:A-Za-z字母数字符号:A-Za-z0-9

  第2步:输出单个文件中的前 N 个最常出现的英语单词。分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。goodGoodGOOD是同一个单词。

 

readFromFile.java

 1 import java.io.BufferedReader; 
 2 import java.io.File; 
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStreamWriter; 
 8 //import java.io.Reader; 
 9 //从文本文档中读入
10 public class readFromFile {
11     public static String readTxtFile(String filePath){ 
12     try { 
13         String encoding="GBK"; 
14         File file=new File(filePath); 
15         if(file.isFile() && file.exists()){ //判断文件是否存在 
16         InputStreamReader read = new InputStreamReader( 
17         new FileInputStream(file),encoding);//考虑到编码格式 
18         BufferedReader bufferedReader = new BufferedReader(read); 
19         String lineTxt = null;
20         String lineText="";
21         while((lineTxt = bufferedReader.readLine()) != null)
22             { 
23             lineText+=(lineTxt); 
24             } 
25         read.close(); 
26         return lineText;
27         }
28         else
29             { 
30             System.out.println("找不到指定的文件"); 
31             } 
32         } catch (Exception e) { 
33         System.out.println("读取文件内容出错"); 
34         e.printStackTrace(); 
35         } 
36         return null;
37     } 
38     public static void daochu(String a) throws IOException
39     {
40         File file=new File("b.txt");
41         FileOutputStream fos=new FileOutputStream(file);
42         OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
43         osw.append(a);
44         osw.close();
45         fos.close();
46     }
47 }

Text.java

  1 import java.io.BufferedReader;
  2 import java.io.File;
  3 import java.io.FileNotFoundException;
  4 import java.io.FileReader;
  5 import java.io.IOException;
  6 import java.text.DecimalFormat;
  7 import java.text.NumberFormat;
  8 import java.util.ArrayList;
  9 import java.util.HashMap;
 10 import java.util.Iterator;
 11 import java.util.Scanner;
 12 public class Text {
 13 static int N=5;
 14 public static String StatList(String str) {
 15     StringBuffer sb = new StringBuffer();
 16     HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表
 17     String[] slist = str.split("[^a-zA-Z\']+");
 18     for (int i = 0; i < slist.length; i++) 
 19     {
 20         if (!has.containsKey(slist[i])) 
 21         { 
 22                has.put(slist[i], 1);
 23         } 
 24         else 
 25         {
 26                has.put(slist[i],has.get(slist[i])+1 );
 27         }
 28     }
 29     Iterator<String> iterator = has.keySet().iterator();
 30     String a[]=new String[100];
 31     int s[]=new int[100];
 32     int judge;
 33     int n;
 34     Scanner in=new Scanner(System.in);
 35     System.out.println("输入前n个最常出现的单词:");
 36     n=in.nextInt();
 37     for(int i=0;i<n;i++)
 38     {
 39         iterator = has.keySet().iterator();
 40         while(iterator.hasNext())
 41         {
 42             String word = (String) iterator.next();
 43             if(s[i]<has.get(word))
 44             {
 45                 s[i]=has.get(word);
 46                 a[i]=word;
 47             }
 48          }
 49         judge=woor(a[i]);
 50         if(judge==1)
 51         {
 52             n++;
 53             has.remove(a[i]);
 54         }
 55         else
 56         {
 57          sb.append("单词:").append(a[i]).append(" 次数").append(has.get(a[i])).append("\r\n");
 58          has.remove(a[i]);
 59         }
 60     }
 61          return sb.toString();
 62     }
 63 
 64 
 65     public static void main(String[] args) 
 66     {
 67         File file = new File("a");
 68         // TODO Auto-generated method stub
 69 //        ArrayList<String> fil=getFiles("a");//目录下的文件
 70         ArrayList<String> fil=getDirectory(file);//目录下的文件和子目录里的文件
 71         for(int i=0;i<fil.size();i++)
 72         {
 73         String filePath = fil.get(i);
 74         String sz=writeFromFile.readTxtFile(filePath);
 75         zimu(filePath);
 76         String ltxt=null;
 77         System.out.println(ltxt=StatList(sz)); 
 78         try {
 79         writeFromFile.daochu(ltxt);
 80         } catch (IOException e) {
 81         // TODO Auto-generated catch block
 82         e.printStackTrace();
 83         }
 84         }
 85     }
 86     public static int woor(String a)
 87     {
 88         int n=0;
 89         String[] biao= {"a","the","an"};
 90         for(int i=0;i<biao.length;i++)
 91         {
 92             if(biao[i].equals(a))
 93             {
 94                 n=1;
 95             }
 96         }
 97         return n;
 98     }
 99     public static ArrayList<String> getFiles(String path) {
100         ArrayList<String> files = new ArrayList<String>();
101         File file = new File(path);
102         File[] tempList = file.listFiles();
103         for (int i = 0; i < tempList.length; i++) {
104             if (tempList[i].isFile()) {
105                 files.add(tempList[i].toString());
106             }
107             if (tempList[i].isDirectory()) {
108             }
109         }
110         return files;
111     }
112     private static ArrayList<String> getDirectory(File file) {
113         ArrayList<String> files = new ArrayList<String>();
114         ArrayList<String> files1 = new ArrayList<String>();
115         //获取该目录下的文件列表
116         File flist[] = file.listFiles();
117         for (File f : flist) {
118             if (f.isDirectory()) {
119                 // 如果f是一个目录
120                 files1=getFiles(f.getAbsolutePath());
121                 files.addAll(files1);
122                
123                 getDirectory(f);
124             } else {
125                 //如果f是一个文件
126                 files.add(f.getAbsolutePath());
127             }
128         }
129         return files;
130     }
131     public static void zimu(String path)
132     {
133         try {
134             //IO操作读取文件内容
135             FileReader fr = new FileReader(path);
136             BufferedReader br = new BufferedReader(fr);
137             DecimalFormat df = new DecimalFormat("#.00");
138             HashMap<String, Integer> map = new HashMap<String, Integer>();
139             
140             String string =null;
141             Integer count = 0;//每个字母的次数
142             Integer total = 0;//总共多少个字母
143             
144             try {
145                 while ((string=br.readLine())!=null) {
146                     char[] ch = string.toCharArray();
147                     
148                     for (int i = 0; i < ch.length; i++) {
149                         if (ch[i] > 'A' && ch[i]< 'z') {
150                             
151                         total++;
152                         ch[i] = Character.toLowerCase(ch[i]);
153                         count = map.get(ch[i]+"");
154                         if (count == null) {
155                             count = 1;
156                         }else {
157                             count++;
158                         }
159                         map.put(ch[i]+"", count);
160                     }
161                     }
162                 }
163             } catch (IOException e) {
164                 // TODO Auto-generated catch block
165                 e.printStackTrace();
166             }
167              ArrayList<String> list = new ArrayList<String>();
168              list.addAll(map.keySet());  //将单词添加到list中
169              NumberFormat numberFormat = NumberFormat.getInstance();
170              
171             // 设置精确到小数点后2位
172      
173             numberFormat.setMaximumFractionDigits(2);
174              
175              //排序按照出现次数降序排列
176              for(int i = 0;i < list.size();i++)
177              {
178                  
179                  for(int j = 0;j < (list.size() - i-1);j++)     //list.size() - i-1因为要用到i+1要考虑是否超出范围的问题
180                  {
181                      
182                      if(map.get(list.get(j)) < map.get(list.get(j+1)))
183                      {
184                          String t = list.get(j);
185                          list.set(j, list.get(j+1));
186                          list.set( j+1, t);
187                      }
188                  }
189              }
190              for(int i = 0 ; i < list.size();i++)
191                 {
192                  
193                     System.out.println(list.get(i) + ":" + map.get(list.get(i)) +"   "+ df.format(((float)map.get(list.get(i)))*100/total) + "%");
194                 }
195             
196             
197         } catch (FileNotFoundException e) {
198             // TODO Auto-generated catch block
199             e.printStackTrace();
200         }
201     }
202     
203 
204 
205 }
posted @ 2019-05-04 06:21  ZZKZS  阅读(281)  评论(0编辑  收藏  举报
/*鼠标跟随效果*/