【101】java多叉樹廣度優先搜尋演算法,搜尋檔案和資料夾
阿新 • • 發佈:2018-12-26
我用了多叉樹廣度優先搜尋,遍歷了檔案的樹形結構,然後用回撥方法判斷檔案或資料夾是否符合搜尋條件。把結果返回到一個集合中。
演示的例子分成三個檔案: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);
}
}