序:一個文件夾下面有很多層的小文件,如何算出這個文件夾下面有多少文件?遞歸遍歷,簡單暴力,遞歸在一般情況確實是比較方便的解決方案,但是當(dāng)文件夾深度多深,遞歸的反復(fù)調(diào)用會導(dǎo)致方法一直無法釋放,造成jvm的棧溢出。那我們該怎么辦?

原文和作者一起討論:http://www.cnblogs.com/intsmaze/p/6031894.html

新浪微博:intsmaze劉洋洋哥

微信:intsmaze

說實話這個問題我以前也沒有遇到過,我是聽一位我很敬佩的IT前輩講的他曾經(jīng)的面試經(jīng)歷。他說他當(dāng)時比較緊張就想到了遞歸,沒有想到其他的方案。

當(dāng)然他跟我說這個問題的時候,它也沒有想到好的處理方案。它認(rèn)為這種情況可以參考網(wǎng)絡(luò)爬蟲的遞歸,為了防止爬蟲在一個深度出不來,通常會設(shè)置每一次爬的深度,然后通過各種的限制條件來保證每一個文件都被訪問到。

當(dāng)時我靈光一閃,因為當(dāng)時我在溫故數(shù)據(jù)結(jié)構(gòu)的知識,我說這個文件夾的層次看著好呀嘛好眼熟,不就相當(dāng)于一個樹的結(jié)構(gòu),那我們學(xué)數(shù)據(jù)結(jié)構(gòu)的時候是如何遍歷節(jié)點的。有左遞歸,中遞歸,右遞歸,當(dāng)然這就是上面的遞歸方法,不是我們要找的解決方案,那么該怎么辦?

看,角落里有我們經(jīng)常忽視的層序遍歷。

層序遍歷:層序遍歷就是從所在樹的根節(jié)點出發(fā),首先訪問第一層的樹根節(jié)點,然后從左到右訪問第2層上的節(jié)點,接著是第三層的節(jié)點,以此類推,自上而下,自左至右逐層訪問樹的結(jié)點的過程就是層序遍歷。

代碼思路:

我們只需要使用一個list集合來存儲每一個文件(夾),然后按次序讀取list集合的元素,并判斷如果是文件夾則把該文件夾下的所有文件(夾)追加到list集合后面,然后讀取list的下一個元素以此類推。