题目:用户需求:英语的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 }
功能可以完成,但是没有办法检验准确性。