这个程序解决的问题是:在一个文本文件中放入一个文章,我们放入的文章是《飘》
第0步:输出文本文件中26个英文单词出现的频率,由高到低排列,并显示字母出现的出现的百分比,精确到小数点后面两位。要求:
字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)
如果两个字母出现的频率一样,那么就按照字典序排列。 如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。
这个部分的代码为:
package piao; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.text.NumberFormat; public class piao1{ private static String formattedDecimalToPercentage(double d) { //获取格式化对象 NumberFormat n = NumberFormat.getPercentInstance(); //设置百分数精确度2即保留两位小数 n.setMinimumFractionDigits(2); return nt.format(decimal); } public static void main(String []args) { String aa; char a='A'; int b[]=new int[27]; char c[]=new char[26]; char d[]=new char[26]; for(int i=0;i<26;i++) { c[i]=a; d[i]=(char)(a+32); a++; } /*for(int i=0;i<26;i++) { System.out.println(b1[i]); System.out.println(b2[i]); }*/ try { BufferedReader in = new BufferedReader(new FileReader("D:\飘.txt")); String s; while ((s= in.readLine()) != null) { // System.out.println(str); char[] d=s.toCharArray(); for(int i=0;i<d.length-1;i++) { for(int j=0;j<26;j++) { if(c[j]==dd[i]||d[j]==dd[i]) { b[j]++; } } } } b[26]=0; for(int i=0;i<26;i++) { b[26]=b[i]+b[26]; } for(int i=0;i<26;i++) { System.out.print(c[i]); System.out.print("和"); System.out.print(c[i]); System.out.print("出现的次数为:"); System.out.println(b[i]); double dd=(double)((double)b[i]/(double)b[26]); String r2=formattedDecimalToPercentage(dd); System.out.println("result = "+r2); } } catch (IOException e) { } } }
首先要设置精确到小数点后两位,然后要设置数组,读取文件。
第一步是:输出单个文件中的前 N 个最常出现的英语单词。一个用于统计文本文件中的英语单词出现频率。
要求:
以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。
英文字母:A-Z,a-z
字母数字符号:A-Z,a-z,0-9
代码为:
package piao; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; public class piao { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new FileReader( "D:\飘.txt")); StringBuffer buffer = new StringBuffer(); String line = null; while ((line = reader.readLine()) != null) { buffer.append(line); } reader.close(); Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词 String string = buffer.toString(); Matcher matcher = expression.matcher(string);// Map<String, Integer> map = new TreeMap<String, Integer>(); String w = ""; int t= 0; while (matcher.find()) {// 是否匹配单词 w= matcher.group();// 得到一个单词-树映射的键 if (map.containsKey(w)) {// 如果包含该键,单词出现过 t= map.get(w);// 得到单词出现的次数 map.put(w, t+ 1); } else { map.put(w, 1);// 否则单词第一次出现,添加到映射中 } } /* * 核心:如何按照TreeMap 的value排序而不是key排序.将Map.Entry放在集合里, 重写比较器,在用 * Collections.sort(list, comparator);进行 排序 */ List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>( map.entrySet()); /* * 重写比较器 * 取出单词个数(value)比较 */ Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) { return (left.getValue()).compareTo(right.getValue()); } }; Collections.sort(list, comparator);// 排序 System.out.println("请输入要输出的单词个数:"); Scanner s=new Scanner(System.in); int n=s.nextInt(); int last = list.size() - 1; for (int i = last; i > last - n; i--) { String key = list.get(i).getKey(); Integer value = list.get(i).getValue(); System.out.println(key + " :" + value); } } }
输出单个文件中的前 N 个最常出现的英语单词。程序运行结果如图:
总结:这两步的程序都用到了对文件的读取,以及数组的使用