序:乙個資料夾下面有很多層的小檔案,如何算出這個資料夾下面有多少檔案?遞迴遍歷,簡單暴力,遞迴在一般情況確實是比較方便的解決方案,但是當資料夾深度多深,遞迴的反覆呼叫會導致方法一直無法釋放,造成jvm的棧溢位。那我們該怎麼辦?
原文和作者一起討論:
說實話這個問題我以前也沒有遇到過,我是聽一位我很敬佩的it前輩講的他曾經的面試經歷。他說他當時比較緊張就想到了遞迴,沒有想到其他的方案。
當然他跟我說這個問題的時候,它也沒有想到好的處理方案。它認為這種情況可以參考網路爬蟲的遞迴,為了防止爬蟲在乙個深度出不來,通常會設定每一次爬的深度,然後通過各種的限制條件來保證每乙個檔案都被訪問到。
當時我靈光一閃,因為當時我在溫故資料結構的知識,我說這個資料夾的層次看著好呀嘛好眼熟,不就相當於乙個樹的結構,那我們學資料結構的時候是如何遍歷節點的。有左遞迴,中遞迴,右遞迴,當然這就是上面的遞迴方法,不是我們要找的解決方案,那麼該怎麼辦?
看,角落裡有我們經常忽視的層序遍歷。
層序遍歷:層序遍歷就是從所在樹的根節點出發,首先訪問第一層的樹根節點,然後從左到右訪問第2層上的節點,接著是第三層的節點,以此類推,自上而下,自左至右逐層訪問樹的結點的過程就是層序遍歷。
我們只需要使用乙個list集合來儲存每乙個檔案(夾),然後按次序讀取list集合的元素,並判斷如果是資料夾則把該資料夾下的所有檔案(夾)追加到list集合後面,然後讀取list的下乙個元素以此類推。
public都是有經驗的開發人員,上面的**就沒有必要進行注釋了。class
demo }}
}}
當然有人會較真,當檔案數量很多,就算這**可以保證棧不溢位,但是list集合數量上去了,堆也會爆的。
當然,這是一種情況,其實也很簡單,每從集合讀取乙個元素,就把該元素從集合溢位,存入硬碟中即可,然後迴圈裡面的判斷條件中不對i進行遞增即可。
public大家有更好的解決方案可以一起分享討論.class
demo
}list.remove(i);}}
}
intsmaze(劉洋)
出處:
由於博主能力有限,文中可能存在描述不正確,歡迎指正、補充!
如何遍歷資料夾下上億檔案而不棧溢位
序 乙個資料夾下面有很多層的小檔案,如何算出這個資料夾下面有多少檔案?遞迴遍歷,簡單暴力,遞迴在一般情況確實是比較方便的解決方案,但是當資料夾深度多深,遞迴的反覆呼叫會導致方法一直無法釋放,造成jvm的棧溢位。那我們該怎麼辦?原文和作者一起討論 說實話這個問題我以前也沒有遇到過,我是聽一位我很敬佩的...
如何遍歷資料夾下上億檔案而不棧溢位
序 乙個資料夾下面有很多層的小檔案,如何算出這個資料夾下面有多少檔案?遞迴遍歷,簡單暴力,遞迴在一般情況確實是比較方便的解決方案,但是當資料夾深度多深,遞迴的反覆呼叫會導致方法一直無法釋放,造成jvm的棧溢位。那我們該怎麼辦?原文和作者一起討論 說實話這個問題我以前也沒有遇到過,我是聽一位我很敬佩的...
Python如何import資料夾下的檔案
python的import包含檔案功能就跟php的include類似,但更確切的說應該更像是php中的require,因為python裡的import只要目標不存在就報錯程式無法往下執行。要包含目錄裡的檔案,php中只需要給對路徑就ok。python中則不同,下面來看看這個例子。目錄結構 a.py ...