在读取文件降序输出单词及其个数的基础上,将txt文件存入文件夹中,开始递归遍历文件目录,之后输出txt文件中的单词及其个数,仍然是降序排列。
代码如下
1 import java.io.BufferedReader;
2 import java.io.File;
3 import java.io.FileReader;
4 import java.util.Map;
5 import java.util.Map.Entry;
6 import java.util.ArrayList;
7 import java.util.Collections;
8 import java.util.Comparator;
9 import java.util.HashMap;
10 import java.util.List;
11
12 public class Traverse4 {
13 public static void main(String[] args) {
14 Traverse4 K = new Traverse4();
15 //调用遍历方法
16 K.Run("E:\\article");
17 }
18 //递归遍历文件
19 public void Run(String AllFile) {
20 File tfile = new File(AllFile);
21 //构建文件数组
22 File[] files = tfile.listFiles();
23 for(int i = 0; i < files.length; i++) {
24 //判定该文件是否为目录
25 if(files[i].isDirectory()) {
26 //是,递归调用函数
27 Run(files[i].getAbsolutePath());
28 }else {
29 //不是,读取文件输出单词个数
30 System.out.println("**********"+files[i].getAbsolutePath()+"**********");
31 ReadFile(files[i].getAbsolutePath());
32 }
33 }
34 }
35 //统计单词个数,排序,输出
36 public void ReadFile(String fname) {
37 File file=new File(fname);
38 try {
39 FileReader fr = new FileReader(file);
40 BufferedReader bufr = new BufferedReader(fr);
41 String s = null;
42 //创建哈希表
43 Map<String,Integer> hm = new HashMap<>();
44 while((s=bufr.readLine())!=null){
45 //利用正则表达式分割出单词
46 String[]strs = s.split("[^a-zA-Z0-9]");
47 //向哈希表存入单词,统计个数
48 for(int i = 0; i < strs.length; i++){
49 strs[i].toLowerCase();
50 if(!hm.containsKey(strs[i])){
51 hm.put(strs[i], 1);
52 }else{
53 Integer counts = hm.get(strs[i]);
54 hm.put(strs[i], counts+1);
55 }
56 }
57 }
58 //调用排序方法
59 sort(hm);
60 bufr.close();
61 fr.close();
62 }catch(Exception e){
63 e.printStackTrace();
64 }
65 }
66
67 public void sort(Map<String,Integer>map) {
68 //重写List降序排序
69 List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
70 Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {
71 public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
72 return (o2.getValue() - o1.getValue());
73 }
74 });
75 //输出
76 for (int i = 0; i < infoIds.size(); i++) {
77 Entry<String, Integer> id = infoIds.get(i);
78 System.out.println(id.getKey()+":"+id.getValue());
79 }
80 }
81 }
此次任务只需要编写一个能够实现递归遍历文件目录的方法即可,重点还是统计单词个数和排序输出,这次统计与排序全部都由HashMap完成,统计方法是在编入单词之前先使用containsKey()抓取已存在的键信息,若单词存在其值+1,否则新构建键,以值为1的形式存入该单词。排序则是重写List方法实现,输出时要注意遍历重写后的List对象,如果遍历的是之前创建的HashMap对象,得到的结果是没有排序之前的数据。