2009-12-05 37 views
2

我有一個大的文本文件,我需要在Java中進行排序。其格式爲:在Java中排序非常大的文本文件

字[標籤]頻率[新線]

該算法用於分類是:

  • 閱讀部分文件的,對於purlely字母字濾波。
  • 一旦您有X個字母字,請調用Collections.sort並將結果寫入文件。
  • 重複,直到讀完文件。
  • 開始讀取兩個排序文件,逐行比較更高頻率的詞,並同時寫入新文件,以免將太多內存載入內存中
  • 重複,直到所有文件合併爲一個大文件文件

現在我已經把大文件分成了更小的文件(按降序排列),每行有10,000行。我知道我需要以某種方式將這些文件合併到一起,但我不知道如何去解決這個問題。

我創建了一個LinkedList來跟蹤所有創建的文件。該算法表示比較兩個文件中的每一行,除了我已經嘗試過一種情況,比如file1 = 8,6,5,3,1和file2 = 9,8,8,8,8。然後,如果我逐行比較它們,我會得到file3 = 9,8,8,6,8,5,8,3,8,1,這是不正確的排序(它們應該是降序)。

我想我誤解了算法的某些部分。如果有人能指出我應該做什麼,我會非常感激。謝謝。

編輯:是的,這是一項任務。我們不允許增加內存不幸的是:(

+0

只是檢查,但你確定它不是一個選項只是爲了堆起來的堆大小,並在一次完成所有事情? – skaffman 2009-12-05 20:00:35

+3

...或者這是作業嗎? – skaffman 2009-12-05 20:01:05

+1

如果這不是家庭作業,那麼明智的解決方案是使用現有的排序實用程序,如Linux/UNIX'sort'命令。 – 2009-12-06 02:34:37

回答

3

你有正確的想法,但有一個小錯誤。當你從2個文件中讀取行時,你不應該輸出這兩行,因爲下一行具有較大數量的文件中仍可能會高於該數值越小文件中的第一行(因爲它是在你的測試用例)

所以,這是相當簡單:。

讀取一行從每個文件開始
然後重複此操作:
。將具有最高值的行寫入新文件
。只從該文件中讀取另一行

這是基本算法,但當然您必須考慮到其中一個文件用完時會發生什麼情況(在這種情況下,您只需讀取剩餘行數和輸出文件 - 這是一個單獨的循環還是同一個循環的一部分取決於你 - 我會在做出該決定之前查看代碼的樣子)。

+2

託尼回覆+1。您需要遵循的算法是合併排序(http://en.wikipedia.org/wiki/Merge_sort)的「合併」部分,您可以在其中合併兩個排序的數組/列表。 – djunforgetable 2009-12-05 21:20:08

+0

哦,好吧,我想我知道現在需要做什麼。謝謝! – Mel 2009-12-05 22:01:16

+0

其實,我認爲在回答這個問題的後期階段你會遇到另一個問題。那是當你在兩個不同頻率的文件中有相同的單詞時。這將是一個稍微難以回答的問題...... – 2009-12-05 22:54:54

0

如果文件太大而無法放入內存,請使用數據庫。像MySQL這樣的東西可能太重,但是可以在java中使用可嵌入的數據庫。

其中之一是berkely DB這是一個鍵/值數據庫系統。

Apache Derby是一個關係數據庫系統,可讓您使用SQL。

如果您已經知道SQL,德比可能是最簡單的方法。我自己並沒有使用它。