2011-10-25 100 views
2

是否可以使用double while/for循環讀取文本文件?雙重循環讀取文本文件

我想要做這樣的事情:

for(String row1 = 0; row1 < file.length; row1++) { 

    for(String row2 = row1 + 1; row2 < file.length; row2++){ 

     if(file[row1] == file[row2]){ 
      // other code 
     } 

    } 

} 

我需要一個雙循環,因爲我必須要找到文件中重複的行與行2.500.000。 我無法使用Set來保存行,因爲堆大小不足,如果我嘗試增加它,我得到此錯誤:「虛擬機初始化期間發生錯誤 無法爲對象堆預留足夠的空間 無法創建Java虛擬機。」(我有一個Windows 7 64位和8 GB的RAM)

在此先感謝

+1

您可能需要使用一個數據庫。 – SLaks

+0

該文件包含多少個字節? – Sibbo

+0

你想用這些重複行做什麼? – tjg184

回答

6

排序原始文件(你可以把它分解和使用歸併排序)。然後迭代地找到dups(如果prev == cur,你找到了dup)。

+0

,但這樣堆問題的大小應該保持......或者我錯了嗎? – Webman

+0

@Webman不,這樣可以解決堆大小問題,因爲一旦將數據寫入磁盤,就不會保留對數據的引用。垃圾收集器將能夠做到這一點。我已經添加了另一個解釋更詳細的答案,並有一些指向您的實現細節和僞代碼的鏈接。 –

0

你可以這樣做。但表現是O(n²),這不太好。另外,請注意使用==。這將檢查這兩個實例是否是相同的對象,它與使用equals不同。也許你可以爲每一行計算一個散列,並用它來嗅探可能的衝突。

+0

性能並不重要:我只是想刪除重複的行以獲取新文件。 – Webman

+0

然後我調查Moishe的解決方案將工作得很好。您可以解析文件,輸出到兩個文件的一半大小,並繼續遞歸地執行幾次。然後從這些較小的文件開始合併排序回大文件。很多IO,速度慢,但內存使用量可以保持最小。 –

1

根據您的問題及其後的註釋,您的目標是在大文件中查找重複項。最壞的情況是O(N^2) - 比較每個對象與其他對象。更好的解決方案是先排序。

由於文件太大而無法分配足夠的內存在內存中分類,因此需要使用其他方法。 How could the UNIX sort command sort a very large file?提供了一些暗示的細節。一般問題是"external sorting"

來自維基百科頁面的僞代碼應該很容易遵循和實現。如果你感覺真的很勇敢,你可以使用Unix排序命令和Knuth書的相應頁面的算法細節。

...最後,一些Googled code,我還沒有真正審查或測試:

+0

我沒有足夠的時間研究它:(我選擇了數據庫方式 – Webman

+0

這並沒有回答這個問題。 – trojanfoe