1. 程式人生 > >【101】java多叉樹廣度優先搜尋演算法,搜尋檔案和資料夾

【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);
    }

}