在读取文件降序输出单词及其个数的基础上,将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对象,得到的结果是没有排序之前的数据。