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

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

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

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

  1 import java.io.BufferedReader;
  2 import java.io.File;
  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.HashMap;
  9 import java.util.Iterator;
 10 import java.util.List;
 11 import java.util.StringTokenizer;
 12 public class test2 {
 13 public static void main(String[] args)throws IOException
 14 {
 15 List<Integer> list=new ArrayList<>();
 16 DecimalFormat df=new DecimalFormat("######0.00");
 17 File f = new File("piao1.txt");
 18 FileInputStream fip = new FileInputStream(f);
 19 InputStreamReader reader = new InputStreamReader(fip, "gbk");
 20 StringBuffer sb = new StringBuffer();
 21 while (reader.ready()) {
 22 sb.append((char) reader.read());
 23 }
 24 System.out.println(sb.toString());
 25 reader.close();
 26 fip.close();
 27 int i;
 28 String A=sb.toString();
 29 String M="abcdefghijklmnopqrstuvwxyz";
 30 String temp = "";
 31 char NUM[]=new char[A.length()];
 32 char Z[]=new char[26];
 33 int X[]=new int[26];
 34 int MAX=0;
 35 Z=M.toCharArray();
 36 for(int k=0;k<26;k++)
 37 {
 38 X[k]=0;
 39 for(i=0;i<A.length();i++)
 40 {
 41 NUM[i]=A.charAt(i);
 42 if(Z[k]==NUM[i]||Z[k]==ch(NUM[i]))
 43 {
 44 X[k]++;
 45 }
 46 }
 47 }
 48 System.out.println("这篇文章中英文字母个数分别为:");
 49 double sum=0;
 50 System.out.println("////////////排序如下:");
 51 for(i=0;i<25;i++)
 52 for(int k=0;k<25-i;k++)
 53 {
 54 if(X[k]<X[k+1])
 55 {
 56 int temp2=X[k];
 57 X[k]=X[k+1];
 58 X[k+1]=temp2;
 59 char temp3=Z[k];
 60 Z[k]=Z[k+1];
 61 Z[k+1]=temp3;
 62 }
 63 }
 64 for(i=0;i<26;i++)
 65 {
 66 System.out.println(Z[i]+"字母个数为:"+X[i]);
 67 sum=sum+X[i];
 68 }
 69 for(i=0;i<26;i++)
 70 {
 71 double jkl=(X[i])/sum*100;
 72 System.out.println(Z[i]+"字母频率为:"+df.format(jkl)+"%");
 73 }
 74 StringTokenizer st = new StringTokenizer(sb.toString(),",.! \n");
 75 String []a1=StatList(sb.toString());
 76 int[]b1=StatList1(sb.toString());
 77 System.out.println("//////////////////////////////");
 78 for(i=0;i<a1.length-1;i++)
 79 for(int j=0;j<a1.length-1-i;j++)
 80 {
 81 if(b1[j]<b1[j+1])
 82 {
 83 int temp6=b1[j];
 84 b1[j]=b1[j+1];
 85 b1[j+1]=temp6;
 86 String temp7=a1[j];
 87 a1[j]=a1[j+1];
 88 a1[j+1]=temp7;
 89 }
 90 }
 91 for(i=0;i<a1.length-1;i++)
 92 {
 93 System.out.println("单词:"+a1[i]+" 且出现的次数:"+b1[i]);
 94 }
 95 }
 96 static char ch(char c)
 97 {
 98 if(!(c>=97&&c<=122))
 99 c+=32;
100 return c;
101 }
102 static String[] StatList(String str) {
103 StringBuffer sb = new StringBuffer();
104 HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表
105 String[] slist = str.split("\\W+");
106 int sum=0;
107 int sum1=0;
108 for (int i = 0; i < slist.length; i++) {
109 if (!has.containsKey(slist[i])) { // 若尚无此单词
110 has.put(slist[i], 1);
111 sum++;
112 sum1++;
113 } else {//如果有,就在将次数加1
114 Integer nCounts = has.get(slist[i]);
115 
116 has.put(slist[i],nCounts+1 );
117 }
118 }
119 int temp=0;
120 int temp1=0;
121 String []a=new String[sum];
122 int []b=new int[sum1];
123 Iterator iterator = has.keySet().iterator();
124 while(iterator.hasNext()){
125 String word = (String) iterator.next();
126 a[temp]=word;
127 temp++;
128 }
129 return a;
130 }
131 static int[] StatList1(String str) {
132 StringBuffer sb = new StringBuffer();
133 HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表
134 String[] slist = str.split("\\W+");
135 int sum=0;
136 int sum1=0;
137 for (int i = 0; i < slist.length; i++) {
138 if (!has.containsKey(slist[i])) { // 若尚无此单词
139 has.put(slist[i], 1);
140 sum++;
141 sum1++;
142 } else {//如果有,就在将次数加1
143 Integer nCounts = has.get(slist[i]);
144 
145 has.put(slist[i],nCounts+1 );
146 
147 }
148 }
149 int temp=0;
150 int temp1=0;
151 String []a=new String[sum];
152 int []b=new int[sum1];
153 Iterator iterator = has.keySet().iterator();
154 while(iterator.hasNext()){
155 String word = (String) iterator.next();
156 b[temp1]=has.get(word);
157 temp1++;
158 }
159 return b;
160 }
161 }

功能可以完成,但是没有办法检验准确性。

 

posted on 2019-05-04 17:06  雨过山  阅读(120)  评论(0编辑  收藏  举报