2011-01-21 44 views
2

可以說我有500個字:內存意識的字符串過濾

Martin 
Hopa 
Dunam 
Golap 
Hugnog 
Foo 
... + 494 more words 

我有以下文字是關於85KB總數:

Marting去,讓他自己的東西 從Hopa店面,現在他正在尋找 把它與他最好的 朋友Dunam存入存儲。他們正在刨 使用戈拉普鎖,他們發現在 Hugnog店在美孚鎮。 >... text continues into several pages

我想產生以下文字:

-------去,讓他自己的東西 從----店,現在他期待 用他最好的 朋友----把它存入。他們使用----鎖,他們在 發現 刨---------鎮。 >... text continues into several pages

目前我使用公共方法:

String[] 500words = //all 500 words 
String[] maskFor500words = // generated mask for each word 
String filteredText = StringUtils.replaceEach(textToBeFiltered, 500words , maskFor500words); 
  1. 是否有另一種方式來做到這一點,可能是當涉及到內存和CPU的使用更有效率?
  2. 500字的最佳存儲空間是多少?文件,列表,枚舉,數組...?
  3. 您將如何獲得統計信息,如替換了多少個單詞和哪些單詞;併爲每個單詞多少次被替換。
+0

您可以獲取內存分析器來查看您使用的內存量。您可能需要500字來使用64 KB的內存。除非你使用手機來運行這個,否則你不需要擔心。 – 2011-01-21 16:44:56

回答

3

我不太在乎CPU和內存的使用情況。對於這樣的問題和這樣的文本量,它應該相對較小。 我會做的是

  • 有包含所有字符串作爲密鑰的地圖,隨着時代的NUMER他們在文本(最初爲0)
  • 讀取字的文詞,通過使用被發現一個StringTokenizer或String。分割()方法
  • 對於每個單詞,查找映射是否包含它(O(1)操作,非常快)
  • 如果它包含它,則向StringBuilder添加「----」,並將值存儲的單詞在地圖
  • 其他添加本身這個詞(與前一個空間,除非它的文本的第一個字)的過程中

一結束,StringBuilder的包含結果,以及地圖包含每個單詞被用作替換的次數。 確保使用原始文本的長度初始化STringBuilder,以避免太多的重新分配。

應該簡單高效。

1

如果我正確理解問題,則需要讀取85KB的文本並解析出每個單詞(使用split或StringTokenizer)。對於每一個單詞,你需要知道你是否在500字的集合中,如果是的話,用相應的掩碼切換它。

如果你知道你有大約500個單詞,我建議將500個單詞和它們的掩碼存儲在初始容量爲650左右的HashMap中(JDK文檔稱散列效率最高,加載因子爲0.75)。用for循環在HashMap中放入單詞 - 掩碼對。 (HashMap)你得到的最大回響是get/put操作(搜索關鍵字)在常量時間內完成,這比O(n)在數組中更好,甚至O(log( n))如果你對排序後的數組進行二分搜索。

用HashMap武裝起來,你可以建立一個SringBuffer,同時過濾那些85KB的文本。 從你的方法返回String.toString(),你就完成了!問候, - M.S.

PS如果您在服務器上構建地圖並在其他位置(在客戶端)進行過濾並需要傳輸字典,則HashMap將不會執行 - 它不能被序列化。在這種情況下使用Hashtable。如果在同一臺機器上,HashMap的內存效率更高。後來, - M.S.

2

我不會在乎記憶太多,但如果你這樣做:trie是你的朋友。它對於大型設備來說是高效的內存,並且可以非常有效地進行匹配你可能想要在compressed fashion中實現它。