最近面試的時候被問及,使用非遞迴的方式遍歷資料夾下的所有檔案。由於之前沒有寫過,當時卡了一下,最後也沒給出好的方案。
從計算機的角度看,資料夾的資料結構就是多叉樹(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);
}
}
}
}
複製程式碼
參考文章: