自己想的方法一直都不是很好,但是又一直忘了改自己的算法,只能硬着头皮接着用自己以前的老方法了
第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
不难看出,这个只要求字母出现的频率,那么我们在读取文件的时候是采取的一次性全部读取,然后用String类自带的方法,将整个字符串转化成每个字符组成的字符串数组,然后获取长度之后一次for循环,然后与26字母进行比对,然后获得数量,最后进行排序。
for (int i = 0; i < shu.length; i++) { switch (shu[i]) { case 'a': zimu[0] = 'a'; count[0]++; break; case 'b': zimu[1] = 'b'; count[1]++; break; case 'c': zimu[2] = 'c'; count[2]++; break; case 'd': zimu[3] = 'd'; count[3]++; break; case 'e': zimu[4] = 'e'; count[4]++; break; case 'f': zimu[5] = 'f'; count[5]++; break; case 'g': zimu[6] = 'g'; count[6]++; break; case 'h': zimu[7] = 'h'; count[7]++; break; case 'i': zimu[8] = 'i'; count[8]++; break; case 'j': zimu[9] = 'j'; count[9]++; break; case 'k': zimu[10] = 'k'; count[10]++; break; case 'l': zimu[11] = 'l'; count[11]++; break; case 'm': zimu[12] = 'm'; count[12]++; break; case 'n': zimu[13] = 'n'; count[13]++; break; case 'o': zimu[14] = 'o'; count[14]++; break; case 'p': zimu[15] = 'p'; count[15]++; break; case 'q': zimu[16] = 'q'; count[16]++; break; case 'r': zimu[17] = 'r'; count[17]++; break; case 's': zimu[18] = 's'; count[18]++; break; case 't': zimu[19] = 't'; count[19]++; break; case 'u': zimu[20] = 'u'; count[20]++; break; case 'v': zimu[21] = 'v'; count[21]++; break; case 'w': zimu[22] = 'w'; count[22]++; break; case 'x': zimu[23] = 'x'; count[23]++; break; case 'y': zimu[24] = 'y'; count[24]++; break; case 'z': zimu[25] = 'z'; count[25]++; break; case 'A': zimu[26] = 'A'; count[26]++; break; case 'B': zimu[27] = 'B'; count[27]++; break; case 'C': zimu[28] = 'C'; count[28]++; break; case 'D': zimu[29] = 'D'; count[29]++; break; case 'E': zimu[30] = 'E'; count[30]++; break; case 'F': zimu[31] = 'F'; count[31]++; break; case 'G': zimu[32] = 'G'; count[32]++; break; case 'H': zimu[33] = 'H'; count[33]++; break; case 'I': zimu[34] = 'I'; count[34]++; break; case 'J': zimu[35] = 'G'; count[35]++; break; case 'K': zimu[36] = 'K'; count[36]++; break; case 'L': zimu[37] = 'L'; count[37]++; break; case 'M': zimu[38] = 'M'; count[38]++; break; case 'N': zimu[39] = 'N'; count[39]++; break; case 'O': zimu[40] = 'O'; count[40]++; break; case 'P': zimu[41] = 'P'; count[41]++; break; case 'Q': zimu[42] = 'Q'; count[42]++; break; case 'R': zimu[43] = 'R'; count[43]++; break; case 'S': zimu[44] = 'S'; count[44]++; break; case 'T': zimu[45] = 'T'; count[45]++; break; case 'U': zimu[46] = 'U'; count[46]++; break; case 'V': zimu[47] = 'V'; count[47]++; break; case 'W': zimu[48] = 'W'; count[48]++; break; case 'X': zimu[49] = 'X'; count[49]++; break; case 'Y': zimu[50] = 'Y'; count[50]++; break; case 'Z': zimu[51] = 'Z'; count[51]++; } } int ci = 0; int sum = 0; System.out.println("短文中各字母出现情况统计如下:"); for (int i = 0; i < 26; i++) { count[i] += count[i + 26]; if (count[i] != 0) { ci++; sum += count[i]; System.out.println(ci + ".字母" + zimu[i] + "的出现次数是:" + count[i]); } } for (int i = 0; i < 26; i++) { System.out.println(zimu[i] + "出现的百分比为:" + df.format(count[i] * 1.0 / sum)); } System.out.println("字母共计:" + sum + "个");
第1步:输出单个文件中的前 N 个最常出现的英语单词。
作用:一个用于统计文本文件中的英语单词出现频率。
单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。
在单词中,我想到的方法则是将上面的方法进行的了一点变化,第0步是将字符分隔成为String数组,那在第一步,就变成了把字符变成了字符串,但是之前我们需要的是将一些特别符号转换成成为一个符号,然后再对这个符号进行分割,这样就可以获得单词。
//先使用replace方法,替换特殊符号 //然后再使用map得到个数 Map<String,Integer> map=new HashMap<String,Integer>(); for(String str : temp){ if(map.containsKey(str)){ map.put(str, map.get(str) + 1); }else{ map.put(str, 1); } }