功能0:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
功能1:输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。
功能2: 指定文件目录,对目录下每一个文件执行统计的操作。
功能3:指定文件目录,是会递归遍历目录下的所有子目录的文件进行统计单词的功能。
功能4:输出出现次数最多的前 n 个单词, 例如, 提示统计统计前多少名:输入10。 就是输出最常出现单词的前 10 名。 当没有指明数量的时候,我们默认列出所有单词的频率。
功能0代码:
package fileread; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.math.BigDecimal; public class zero { public static void main(String[] args) { // TODO Auto-generated method stub File f = new File("C://《飘》第一章.txt"); Reader reader; int time [] = new int [27];//记录每个字母出现的次数 for(int i=1;i<27;i++) { time[i]=0; } try{ reader = new InputStreamReader(new FileInputStream(f)); int tempchar; while ((tempchar = reader.read()) != -1) { if(((tempchar-96)>0)&&((tempchar-96)<27)) { time[tempchar-96]++; } if(((tempchar-64)>0)&&((tempchar-64)<27)) { time[tempchar-64]++; } } reader.close(); int sum=0;//所有字母的总数 for(int i=1;i<27;i++) { sum+=time[i]; } double rate [] = new double [27];//每个字母出现次数所占总次数的比率 for(int i=1;i<27;i++) { rate[i] = new BigDecimal((float)time[i]/sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } String result [] = new String [27];//用来存放结果的句子 for(int i=1;i<27;i++) { result[i] = "字母"+(char)(i+96)+"出现了"+time[i]+"次,"+"出现的频率为"+rate[i]; } String str; int ti; for(int i=1;i<27;i++) { for(int j=i+1;j<27;j++) { if(time[i]>time[j]) { ti=time[i]; time[i]=time[j]; time[j]=ti; str=result[i]; result[i]=result[j]; result[j]=str; } } } for(int i=1;i<27;i++) { System.out.println(result[i]); } } catch (IOException e) { e.printStackTrace(); return; } } }
功能0思路:用简单的文件读取,读取字节在经过强制类型转换,将字节转换为字母,并通过ASCII码将读取出来的字母将大写字母与小写字母归为一类,最后再排序。
功能1代码:
package fileread; import java.io.File; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.Iterator; import java.util.Scanner; import java.util.Set; public class one { public static void main(String[] args) { File file=new File("C:\《飘》第一章.txt"); Scanner scanner = null; try { scanner = new Scanner(file); } catch (FileNotFoundException e) { e.printStackTrace(); } HashMap<String, Integer> hashMap=new HashMap<String,Integer>();//单词和数量映射表 //hashmap<>中的参数,前者为键,后者为值,键一定是不重复的,值可以重复,所以只可以通过键得到值,也就是下面用到的get(String)方法 while(scanner.hasNextLine()) { String line=scanner.nextLine(); String[] lineWords=line.split("\W+");//split用于分割句子成为数组,以参数为分割符号 Set<String> wordSet=hashMap.keySet();//通过keyset方法得到所有的键,wordset表示表中存放单词的一列 for(int i=0;i<lineWords.length;i++) { if(wordSet.contains(lineWords[i]))//如果已经有这个单词了 { Integer number=hashMap.get(lineWords[i]); number++; hashMap.put(lineWords[i], number); } else { hashMap.put(lineWords[i], 1); } } } System.out.println("统计单词:------------------------------"); Iterator<String> iterator=hashMap.keySet().iterator(); while(iterator.hasNext()) { String word=iterator.next(); System.out.println("单词: "+word+"出现次数:"+hashMap.get(word)); } } }
功能1思路:主要用了HashMap类,键存放单词,值存放出现的次数,还利用到了几个该类常用的方法,在代码中都有讲解,这里不再多说。