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

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

新浪微博:intsmaze劉洋洋哥

微信:intsmaze

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

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

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

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

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

代碼思路:

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

復(fù)制代碼
public class demo { public 
        		

網(wǎng)友評論