2009-07-06 39 views
4

我需要操縱Java中的大型字符串(刪除並再次刪除並添加刪除的 字符,移動字符),但仍想記住原始位置偏移量 。例如。 「計算機」這個詞在原始文本中起始於偏移量 133,然後移動到位置244,我仍然要 想要它的信息最初在位置133. 最醜陋的(和資源飢餓的)解決方案將是存儲爲 每個角色的原始位置加上它的位置變化。 肯定是更好的解決方案,但也是更復雜的解決方案。 是否有任何良好的文本操作庫,有我的問題的解決方案 ?我不想重新發明輪子。文本操作,同時保持原始位置偏移

問候, 凱

+0

這是爲了實現某種撤銷/重做功能? – 2009-07-06 11:12:33

+0

某種。它是基於Eclipse RCP構建的文本分析應用程序的一部分。例如,用戶可以選擇僅查看文檔的重要內容,然後再查看整個文檔。問題在於文本高於文本上方的高亮和圖形邊緣。所以重要的是要記住原來的位置以知道在哪裏繪製這些東西。 – Zardoz 2009-07-07 23:00:42

回答

2

這些字符串有多大?鑑於今天可用的內存數量,蠻力可能是一條可行的路。

你談論的是移動單詞,但存儲字符位置。爲什麼不存儲單詞位置,以及每個單詞的歷史記錄。請注意,您可能很聰明,並使用flyweight pattern來保存這些對象的多個實例直到您需要。即你的「字符串」對象包含一個「計算機」字對象,但記錄該字出現在位置133,245,667等處(加上歷史記錄,當你需要它時)

1

你指的問題是正式名稱爲「String-to-string correction problem」這是關係到Delta EncodingLevenshtein DistanceHere是計算距離的代碼(它是用Java編寫的)。所有的差異代碼都在那裏,你只需添加跟蹤步驟的代碼,以便反轉或跟蹤它們。注意:「移動」一個單詞或字符應該是一起出現的同一單詞的刪除/插入對。

這應該適用於字符,單詞和子串移動。

+0

好點,但我不認爲我需要計算Levenshtein距離,因爲我已經知道編輯內容。例如,如果在文檔內刪除了某些內容,我總是會得到「通知」。 – Zardoz 2009-07-07 23:03:30

0

在強調效率之前,做一個信封計算的背面。當你沒有問題並且有代碼時,你可以再次使用探查器/秒錶進行檢查。

有一個現成的解決方案的形式的Swing文本。它應該可以在Swing環境之外使用,儘管IIRC試圖在EDT上觸發異常(以典型的Swing線程 - 敵對的方式) - 可能需要檢查該異常。即使在插入和刪除之後,仍有Position對象跟蹤Document內的字符位置。如果沒有別的,它會顯示如何完成。據推測,Apache Harmony實施帶有適用於大多數普通人的許可證。