遍歷資料夾的幾種方式

落英墜露發表於2018-07-26

最近面試的時候被問及,使用非遞迴的方式遍歷資料夾下的所有檔案。由於之前沒有寫過,當時卡了一下,最後也沒給出好的方案。

從計算機的角度看,資料夾的資料結構就是多叉樹(Tree),而樹的遍歷方式有兩種:深度優先遍歷和廣度優先遍歷。

1. 採用遞迴的方式實現深度優先遍歷

這種方法最簡單,不需要多解釋。

    private static void traverFile1(File file) {
        System.out.println(file);
        File[] files = file.listFiles();
        if (files != null && files.isDirectory()) {
            for (File f : files) {
                traverFile1(f);
            }
        }
    }
複製程式碼

2. 藉助佇列結構來實現廣度優先遍歷

佇列(Queue)的特點是先進先出,我們從頭部取出 File 列印並移除,然後把 File 下的子 File 新增到佇列,這樣在遍歷的時候,File 的層級是相同的,最終實現廣度優先遍歷。

    private static void traverFile2(File file) {
        LinkedList<File> list = new LinkedList<>();
        list.add(file);
        while (!list.isEmpty()) {
            File f = list.poll();
            System.out.println(f);
            File[] files = f.listFiles();
            if (files != null) {
                list.addAll(Arrays.asList(files));
            }
        }
    }
複製程式碼

3. 藉助棧結構來實現深度優先遍歷

棧(Stack)的特點是後進先出,把 File 出棧並列印,然後把 子 File 壓棧,下次出棧的時候就是子 File,沿著一個方向層層向下,這樣就實現了深度優先遍歷。

    private static void traverFile3(File file) {
        LinkedList<File> list = new LinkedList<>();
        list.add(file);
        while (!list.isEmpty()) {
            File f = list.pop();
            System.out.println(f);
            File[] files = f.listFiles();
            if (files != null) {
                for (File fil : files) {
                    list.push(fil);
                }
            }
        }
    }
複製程式碼

參考文章:

樹的深度優先遍歷、廣度優先遍歷

相關文章