要求:用户需求:
英语的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
第1步:输出单个文件中的前 N 个最常出现的英语单词。
分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词。
1 package 字母频率统计; 2 import java.io.BufferedReader; 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.text.DecimalFormat; 9 import java.util.*; 10 import java.util.ArrayList; 11 import java.util.Collections; 12 import java.util.Comparator; 13 import java.util.HashMap; 14 import java.util.List; 15 import java.util.Map; 16 import java.util.Map.Entry; 17 public class test2 { 18 public static void danci() throws FileNotFoundException { 19 File file=new File("D:/QQ/1920126082/FileRecv/c1.txt"); //读取文件 20 Scanner input=new Scanner(file); 21 HashMap<String,Integer> hashMap=new HashMap<String,Integer>(); 22 while(input.hasNextLine()) { 23 String line=input.nextLine(); 24 String[] lineWords=line.split("\W+"); 25 Set<String> wordSet=hashMap.keySet(); 26 for(int i=0;i<lineWords.length;i++) { 27 if(wordSet.contains(lineWords[i])) { 28 Integer number=hashMap.get(lineWords[i]); 29 number++; 30 hashMap.put(lineWords[i], number); 31 } 32 else { 33 hashMap.put(lineWords[i], 1); 34 } 35 } 36 } 37 for (String key : hashMap.keySet()) { 38 System.out.println(key+"出现:"+hashMap.get(key)+"次"); 39 } 40 } 41 42 public static void danci2() throws IOException { 43 Scanner input=new Scanner(System.in); 44 System.out.println("输入要统计的个数:"); 45 int n=input.nextInt(); 46 File file = new File("D:/QQ/1920126082/FileRecv/c1.txt"); 47 FileInputStream fis = new FileInputStream(file); 48 InputStreamReader isr = new InputStreamReader(fis); 49 50 int thechar; 51 StringBuffer sb = new StringBuffer(); 52 HashMap<String, Integer> wordList = new HashMap<String, Integer>(); 53 54 while ((thechar = isr.read()) != -1) { 55 char letter = (char) thechar; 56 if ((letter >= 'a' && letter <= 'z') 57 || (letter >= 'A' && letter <= 'Z')) { 58 sb.append(letter); 59 } else if (sb.length() != 0) { 60 String theword = new String(sb); 61 if (wordList.containsKey(theword)) { 62 wordList.put(theword, wordList.get(theword) + 1); 63 } else { 64 wordList.put(theword, 1); 65 } 66 sb.delete(0, sb.length()); 67 } 68 } 69 isr.close(); 70 71 List<Map.Entry<String, Integer>> words = new ArrayList<Map.Entry<String, Integer>>( 72 wordList.entrySet()); 73 74 Collections.sort(words, new Comparator<Map.Entry<String, Integer>>() { 75 76 @Override 77 public int compare(Entry<String, Integer> o1, 78 Entry<String, Integer> o2) { 79 return -(o1.getValue() - o2.getValue()); 80 } 81 }); 82 System.out.println("读取的文件中出现频率最多的"+n+"个单词是:"); 83 int i = 0; 84 for (Map.Entry<String, Integer> node : words) { 85 if (i < n) { 86 System.out.println(node.getKey() + " : " + node.getValue()); 87 } else { 88 break; 89 } 90 i++; 91 } 92 } 93 public static void zimu() { 94 DecimalFormat df = new DecimalFormat("0.00%"); 95 try { 96 char shu[] = new char[100000]; 97 char zimu[] = new char[52]; 98 int j=0; 99 int count[]=new int[52]; 100 String pathname="D:/QQ/1920126082/FileRecv/c1.txt"; 101 File filename=new File(pathname); 102 InputStreamReader reader=new InputStreamReader(new FileInputStream(filename)); 103 BufferedReader br=new BufferedReader(reader); 104 String line[]=new String[100000];; 105 for(int i=0;i<line.length;i++){ 106 line[i]=br.readLine(); 107 } 108 br.close(); 109 int k=0; 110 while(line[k]!=null) { 111 for(int i=0;i<line[k].length();i++) { 112 shu[j]=line[k].charAt(i); 113 j++; 114 } 115 k++; 116 } 117 for(int i=0;i<shu.length;i++) { 118 switch(shu[i]) { 119 case 'a':zimu[0]='a';count[0]++;break; 120 case 'b':zimu[1]='b';count[1]++;break; 121 case 'c':zimu[2]='c';count[2]++;break; 122 case 'd':zimu[3]='d';count[3]++;break; 123 case 'e':zimu[4]='e';count[4]++;break; 124 case 'f':zimu[5]='f';count[5]++;break; 125 case 'g':zimu[6]='g';count[6]++;break; 126 case 'h':zimu[7]='h';count[7]++;break; 127 case 'i':zimu[8]='i';count[8]++;break; 128 case 'j':zimu[9]='j';count[9]++;break; 129 case 'k':zimu[10]='k';count[10]++;break; 130 case 'l':zimu[11]='l';count[11]++;break; 131 case 'm':zimu[12]='m';count[12]++;break; 132 case 'n':zimu[13]='n';count[13]++;break; 133 case 'o':zimu[14]='o';count[14]++;break; 134 case 'p':zimu[15]='p';count[15]++;break; 135 case 'q':zimu[16]='q';count[16]++;break; 136 case 'r':zimu[17]='r';count[17]++;break; 137 case 's':zimu[18]='s';count[18]++;break; 138 case 't':zimu[19]='t';count[19]++;break; 139 case 'u':zimu[20]='u';count[20]++;break; 140 case 'v':zimu[21]='v';count[21]++;break; 141 case 'w':zimu[22]='w';count[22]++;break; 142 case 'x':zimu[23]='x';count[23]++;break; 143 case 'y':zimu[24]='y';count[24]++;break; 144 case 'z':zimu[25]='z';count[25]++;break; 145 case 'A':zimu[26]='A';count[26]++;break; 146 case 'B':zimu[27]='B';count[27]++;break; 147 case 'C':zimu[28]='C';count[28]++;break; 148 case 'D':zimu[29]='D';count[29]++;break; 149 case 'E':zimu[30]='E';count[30]++;break; 150 case 'F':zimu[31]='F';count[31]++;break; 151 case 'G':zimu[32]='G';count[32]++;break; 152 case 'H':zimu[33]='H';count[33]++;break; 153 case 'I':zimu[34]='I';count[34]++;break; 154 case 'J':zimu[35]='G';count[35]++;break; 155 case 'K':zimu[36]='K';count[36]++;break; 156 case 'L':zimu[37]='L';count[37]++;break; 157 case 'M':zimu[38]='M';count[38]++;break; 158 case 'N':zimu[39]='N';count[39]++;break; 159 case 'O':zimu[40]='O';count[40]++;break; 160 case 'P':zimu[41]='P';count[41]++;break; 161 case 'Q':zimu[42]='Q';count[42]++;break; 162 case 'R':zimu[43]='R';count[43]++;break; 163 case 'S':zimu[44]='S';count[44]++;break; 164 case 'T':zimu[45]='T';count[45]++;break; 165 case 'U':zimu[46]='U';count[46]++;break; 166 case 'V':zimu[47]='V';count[47]++;break; 167 case 'W':zimu[48]='W';count[48]++;break; 168 case 'X':zimu[49]='X';count[49]++;break; 169 case 'Y':zimu[50]='Y';count[50]++;break; 170 case 'Z':zimu[51]='Z';count[51]++; 171 } 172 } 173 int ci=0; 174 int sum=0; 175 System.out.println("短文中各字母出现情况统计如下:"); 176 int a[]=new int[26]; 177 for(int i=0;i<26;i++) 178 { 179 180 a[i]=count[i]+count[i+26]; 181 int max=a[0]; 182 if(count[i]!=0) { 183 ci++; 184 sum+=count[i]; 185 System.out.println(ci+".字母"+zimu[i]+"或字母"+zimu[i+26]+"的出现次数是:"+a[i]); 186 } 187 } 188 for (int i = 0; i < 26; i++) { 189 //System.out.println(zimu[i]+"或字母"+zimu[i+26]+"出现的百分比为:"+df.format(count[i]*1.0/sum)); 190 } 191 System.out.println("字母共计:"+sum+"个"); 192 }catch (Exception e) { 193 e.printStackTrace(); 194 } 195 } 196 197 public static void menu() { 198 System.out.println("*****************************"); 199 System.out.println("欢迎访问本系统"); 200 System.out.println("1.统计字母出现情况"); 201 System.out.println("2.统计不重复单词情况"); 202 System.out.println("3.统计出现次数前n个单词"); 203 System.out.println("0.退出"); 204 System.out.println("*****************************"); 205 System.out.println("请选择:"); 206 } 207 public static void main(String[] args) throws IOException { 208 209 Scanner shuru=new Scanner(System.in); 210 int a=1; 211 212 while(a!=0) { 213 menu(); 214 a=shuru.nextInt(); 215 switch(a) 216 { 217 case 1:zimu();break; 218 case 2:danci();break; 219 case 3:danci2();break; 220 case 0:a=0;break; 221 default:a=0;break; 222 } 223 } 224 } 225 }