迭代及用遞迴遍歷File檔案
遞迴:指的是當前方法呼叫自己的一
遞迴的分類:
-
遞迴分為兩類:直接遞迴和間接遞迴
-
直接遞迴:稱為方法自身呼叫自己的情況
-
間接遞迴:可以歸結為:方法A呼叫了方法B,方法B呼叫了方法C,方法C反過來又呼叫了方法A。
種現象。
注意事項:
-
遞迴一定要有邊界條件 (條件限定),保證遞迴能夠停止下來,否則會發生棧記憶體溢位。
-
在遞迴當中雖然有限定條件,但是遞迴的次數也不能太多,否則也會發生棧記憶體溢位現象。
-
構造方法禁止遞迴。
遞迴例項程式碼:
1.計算1~n的和
public int sum(int n){
//設定邊界條件
if(n==1){
return 1;
}
return n+sum(n-1);//遞迴呼叫自己
}
圖解:
2.遞迴求階乘
階乘:所有小於及等於該數的正整數的乘積。
n的階乘:n! = n * (n-1) * (n-2) * (n-3) * ... * 3 * 2 * 1
public int sum1(int n){
//設定邊界條件
if(n==1){
return 1;
}
return n*sum1(n-1);//遞迴呼叫自己
}
3.遞迴列印檔案多級目錄:
public static void main(String[] args) {
// 找到Hello檔案的路徑
File file = new File("C:\\Users\\admin\\Desktop\\Hello");
//呼叫getAllFiles()
getAllFiles(file);
}
/*
定義一個方法,引數傳遞File型別的目錄
方法中要對目錄進行遍歷
*/
public static void getAllFiles(File file) {
// 表明file此時是一個目錄
System.out.println(file);
//首先先獲取到它直接子目錄和直接子檔案
File[] files = file.listFiles();
// 遍歷files目錄
for (File f : files) {
// 判斷如果得到的f是一個目錄,需要再次遍歷
if (f.isDirectory()) {
// 表明f是一個目錄,則繼續遍歷這個目錄
//getAllFiles方法就是獲取所有的檔案,引數傳遞的剛好是目錄。所以直接呼叫getAllFiles:遞迴(自己呼叫自己)
getAllFiles(f);
} else {
// 此時f不是一個目錄,肯定是一個檔案
System.out.println(f);
}
}
}
4.檔案搜尋:
C:\Users\admin\Desktop\Hello目錄中的所有的.txt檔案
public static void main(String[] args) {
//構建一個File物件得到C:\Users\admin\Desktop\Hello路徑
File file = new File("C:\\Users\\admin\\Desktop\\Hello");
getAllTxt(file);
}
/*
定義一個方法,遍歷所有的.txt檔案
方法中依然需要傳引數目錄
*/
public static void getAllTxt(File dir) {
//System.out.println(dir);
File[] files = dir.listFiles();
//遍歷files
for (File f : files) {
// 判斷f是否是一個目錄
if (f.isDirectory()) {
//遞迴呼叫自己
getAllTxt(f);
} else {
// 先獲取檔案的名稱
/* String name = f.getName();
//String path = f.getPath();
// 大寫字串轉換成小寫 (windows系統預設不區分大小寫,linux系統區分大小寫)
name = name.toLowerCase();
// 再次判斷名稱是否以.txt結尾
if (name.endsWith(".txt")) {
System.out.println(f);
}*/
// 鏈式程式設計
if (f.getName().toLowerCase().endsWith(".txt")) {
System.out.println(f);
}
}
}
}
5.檔案過濾器遍歷搜尋指定檔案
java.io.FileFilter
是一個介面,是File的過濾器,該介面的物件可以傳遞給File類的listFiles(FileFilter)作為引數,介面當中只有一個方法:
boolean accept(File pathname)
:測試pathname是否應該包含在當前的File目錄中,如果符合返回true。
public static void main(String[] args) {
//構建一個File物件得到C:\Users\admin\Desktop\Hello路徑
File file = new File("C:\\Users\\admin\\Desktop\\Hello");
getAllTxt(file);
}
/*
定義一個方法,遍歷所有的.txt檔案
方法中依然需要傳引數目錄
*/
public static void getAllTxt(File dir) {
//System.out.println(dir);
//File[] files = dir.listFiles();
File[] files = dir.listFiles(new FileFilterImpl());
//遍歷files
for (File f : files) {
// 判斷f是否是一個目錄
if (f.isDirectory()) {
getAllTxt(f);
} else {
// 先獲取檔案的名稱
System.out.println(f);
}
}
}
// 實現類中的程式碼
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
return true;
}
return pathname.getName()
.toLowerCase()
.endsWith(".txt");
}
程式碼優化:
//匿名類優化
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
return true;
}
return pathname.getName().toLowerCase().endsWith(".txt");
}
});
//lambda表示式優化
File[] files1 = file.listFiles(pathname -> pathname.getName().toLowerCase().endsWith(".txt") || pathname.isDirectory());
for (File file1 : files) {
if (file1.isDirectory()) {
file2(file1);
} else {
System.out.println(file1.getAbsolutePath());
}
}
相關文章
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- Java遞迴遍歷資料夾及檔案過濾器使用(FileFilter)Java遞迴過濾器Filter
- java基礎:遞迴應用---遍歷檔案目錄Java遞迴
- UTL_FILE遍歷檔案
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- js遞迴遍歷講解JS遞迴
- 遞迴遍歷網站所有 url遞迴網站
- Java 資料夾遞迴遍歷Java遞迴
- PHP遞迴遍歷資料夾PHP遞迴
- python 遞迴遍歷目錄Python遞迴
- 非遞迴實現先序遍歷和中序遍歷遞迴
- 程式碼隨想錄演算法訓練營,9月9日 | 二叉樹遞迴遍歷,迭代遍歷,層序遍歷演算法二叉樹遞迴
- 遞迴遍歷物件獲取value值遞迴物件
- 二叉樹非遞迴遍歷二叉樹遞迴
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 【資料結構】二叉樹遍歷(遞迴+非遞迴)資料結構二叉樹遞迴
- 遍歷某一個指定目錄下的所有子目錄和檔案(遞迴)遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 【JavaScript實用技巧(一)】迴圈遍歷與跳出迴圈遍歷JavaScript
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- Java遍歷資料夾的兩種方法(非遞迴和遞迴)Java遞迴
- JNI 檔案遍歷
- [資料結構]二叉樹的前中後序遍歷(遞迴+迭代實現)資料結構二叉樹遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴
- [work] python巢狀字典的遞迴遍歷Python巢狀遞迴
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- C++單連結串列遞迴遍歷操作C++遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 遞迴遍歷磁碟下的某一資料夾中所有檔案,並copy檔案生成檔案和帶資料夾的檔案遞迴