2009-07-06 9 views
4

Javaで大きな文字列を操作する必要があります(削除された 文字を削除して追加した後、文字を移動する)が、元の位置オフセット を覚えています。例えば。 「コンピュータ」という単語は、元のテキストのオフセット 133で始まり、位置244に移動しますが、私はまだ の位置133に元の情報が必要です。 最も醜い すべての文字の元の位置とその位置の変更。そこには が確かに良い解決策であるだけでなく、より複雑な解決策です。 の問題を解決している、優れたテキスト操作ライブラリがありますか?私は車輪を再発明したくありません。元の位置オフセットを維持したままのテキスト操作

よろしく、 甲斐

+0

これは、元に戻す/やり直しの機能を実装するためのものですか? –

+0

何かの。 Eclipse RCP上に構築されたテキスト分析アプリケーションの一部です。例えば、ユーザは、文書の重要な部分だけを見てから、もう一度文書全体を見ることを選択することができる。問題は、テキストの上にハイライトとグラフのエッジが描かれているため、テキストに注釈が付いていることです。したがって、元の位置を覚えて、それらのものをどこに描画するかを知ることが重要です。 – Zardoz

答えて

2

これらの文字列のサイズはどれくらいですか?今日利用可能なメモリの量を考えると、ブルートフォースが行く方法かもしれません。

あなたは言葉を動かすことを話しますが、文字の位置は記憶しています。なぜ単語の位置と単語のインスタンスごとの履歴を格納しないでください。あなたが賢明になり、flyweight patternを使用して、必要になるまでこれらのオブジェクトの複数のインスタンスを保存することができます。つまり、あなたの '文字列'オブジェクトは1つの 'コンピュータ'単語オブジェクトを保持しますが、その単語が位置133,245,667などに存在することを記録します(必要なときに履歴を加えます)

+0

これは私がもっと複​​雑な解決策を意味していたことです;-)しかしあなたは正しいです。誰もその仕事のためのクールな図書館を出さなければ、私はその道を行くでしょう。 – Zardoz

1

あなたが参照している問題は、正式にDelta EncodingLevenshtein Distanceに関連している「String-to-string correction problem」と呼ばれています。 Hereは距離を計算するためのコードです(Javaの場合)。すべての差分コードがそこにあります。ステップを追跡してそれらを元に戻すか、追跡するコードを追加するだけです。注意:単語または文字を「移動する」とは、一緒に発生する同じ単語の削除/挿入ペアです。

これは、文字、単語、および部分文字列の両方の動作に有効です。

+0

良い点ですが、私はすでに何が編集されているか分かっているので、私はLevenshteinの距離を計算する必要はないと思います。たとえば、ドキュメント内で何かが削除された場合、私は常に「通知」を受け取ります。 – Zardoz

0

効率について強調する前に、エンベロープの計算をやり直してください。大丈夫でコードを持っている場合は、プロファイラ/ストップウォッチで再度確認できます。

準備が整った解決策が、スイングテキストの形であります。 IIRCはEDT(典型的なSwingスレッド - 敵対的な方法)で例外を発生させようとしますが、それをチェックしたいかもしれませんが、Swingコンテキストの外部で使用する必要があります。挿入および削除後もDocument内の文字位置を追跡するオブジェクトはPositionです。他に何もない場合は、それがどのようにできるかを示します。おそらく、Apache Harmonyの実装には、ほとんどの普通の人に適したライセンスが付属しています。

関連する問題