【101】java多叉樹廣度優先搜索算法,搜索文件和文件夾

我用了多叉樹廣度優先搜索,遍歷了文件的樹形結構,然後用回調方法判斷文件或文件夾是否符合搜索條件。把結果返回到一個集合中。

演示的例子分成三個文件:FileFilter、SearchFileUtils和Main。下面逐個給出代碼。

FileFilter:

package zhangchao;

import java.io.File;

/**
 * 
 * @author 張超
 * 文件過濾的接口。SearchFileUtils.search(final String folderPath, final FileFilter fileFilter) 方法
 * 的第二個參數。
 */
public interface FileFilter {

    /**
     * SearchFileUtils.search(final String folderPath, final FileFilter fileFilter) 方法
     * 的回調函數。返回true表示符合過濾條件,會加入到返回結果中。false表示不符合過濾條件,不會在返回結果中。
     * 
     * @param file 要被過濾的文件。
     * @return 返回true表示符合過濾條件,會加入到返回結果中。false表示不符合過濾條件,不會在返回結果中。
     */
    public boolean filter(File file);
}

SearchFileUtils:

package zhangchao;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author 張超
 * 搜索指定路徑下的文件夾或文件。
 */
public class SearchFileUtils {

    /**
     * 判斷是否包含子文件或子文件夾。
     * @param f
     * @return true表示包含子文件或子文件夾。
     */
    private static boolean isHasChildren(final File f){
        boolean flag = false;
        File[] list = null;
        if (f.isDirectory()) {
            list = f.listFiles();
        }
        if (null != list && list.length > 0) {
            flag = true;
        }
        return flag;
    }


    /**
     * 搜索文件或文件夾
     * @param folderPath 要搜索的路徑。
     * @param fileFilter 接口FileFilter。過濾出符合條件的File。
     * @return 符合搜索條件的File。
     */
    static List<File> search(final String folderPath, final FileFilter fileFilter) {
        File folder = new File(folderPath);

        ArrayList<File> result = new ArrayList<File>();

        // 樹中當前層節點的集合。
        ArrayList<File> currentLevelNodes = new ArrayList<File>();
        currentLevelNodes.add(folder);

        // 判斷當前層是否有節點
        while(currentLevelNodes.size() > 0){
            // 下一層節點的集合。
            ArrayList<File> nextLevelNodes = new ArrayList<File>();
            // 找到樹中所有的下一層節點,並把這些節點放到 nextLevelNodes 中。
            for (File f : currentLevelNodes) {
                // 如果符合過濾條件,就放到返回結果裏面。
                if (fileFilter.filter(f)){
                    result.add(f);
                }
                // 如果有子節點,就把子節點加入 nextLevelNodes
                if (isHasChildren(f)) {
                    for (File childFile : f.listFiles()) {
                        nextLevelNodes.add(childFile);
                    }
                }
            }

            // 令當前層節點集合的引用指向下一層節點的集合。
            currentLevelNodes = nextLevelNodes;

        }

        result.trimToSize();
        return result;
    }
}

Main:

package zhangchao;

import java.io.File;
import java.util.Collection;
import java.util.List;

/**
 * @author 張超
 * main方法,程序入口。
 */
public class Main {

    /**
     * 打印文件List中,各個文件的路徑。
     * @param files 文件的集合。
     */
    private static void print(final Collection<File> files){
        for (File f : files) {
            System.out.println(f.getPath());
        }
    }

    public static void main(String[] args) {
        // 文件夾路徑
        String folderName = "D:/workspaceSet/vsc/front/src/teacher";
        List<File> list = SearchFileUtils.search(folderName, (file)->{
            String tmpName = file.getName();
            // 後綴是.js的文件全部篩選出來。
            if (tmpName.endsWith(".js")) {
                return true;
            }
            return false;
        });
        print(list);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章