深度遍歷:遞歸的應用

/*
*需求:對指定目錄進行所有內容的列出(包含子目錄中的內容)
*也可以理解爲深度遍歷
*分析:listFiles方法只會列出當前目錄下的所有文件
*但是如果需要訪問當前目錄下的文件下的文件,
* 那還要對listFiles方法
*進一步操作
*
*/

public class FileTest {
public static void main(String[] args) {
    //1,建立當前文件
    File file = new File("demodir");
    //2,需要進行擴展,用函數封裝起來
    enlistAll(file,0);
}
public static void listAll(File file) {
    /*
     * listFiles方法返回一個File對象數組,
     * 將當前目錄下所有文件封裝成file對象
     * 這樣不僅僅侷限於對文件名的操作。
     */
    /*
     * 3,分析過程,思考過程
     * 
     */
    /*File[] dir = file.listFiles();
      for(File name:dir){
        if(name.isDirectory()){//判斷是否是目錄
            //如果是目錄,就繼續遍歷
            File[] dir2 = name.listFiles();
            for(File name2:dir2){
            if(name.isDirectory()){.....};
             * 寫到這發現端倪了,如果還是目錄還要繼續遍歷
             * 我們發現,我們再重複調用這個函數,
             * 想到要用到遞歸!
            }
        }
        //無論是否是目錄都要打印出文件名
        System.out.println(name);
    }*/
}
/*
 *重新建立這個函數,加個參數level 用來表示層級關係 
 */
public static void enlistAll(File file,int level) {
    //每調用一次就打印一次這個文件 getspace方法是爲了區別層級而設的
    System.out.println(getSpace(level)+file.getName());
    level++;
    File[] dir = file.listFiles();
    for(File name:dir){
        //判斷是否是目錄,是就重複進行,調用當前函數(遞歸)
        if(name.isDirectory()){
            enlistAll(name,level);
        }else{
            System.out.println(getSpace(level)+name.getName());
        }

    }

}
public static String getSpace(int level ) {
    StringBuilder sb = new StringBuilder();
    sb.append("|----");
    for(int i = 0;i<level;i++){
        sb.insert(0,"   ");
    }
    return sb.toString();
}}

打印效果

這裏寫圖片描述

發佈了38 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章