4

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

よろしく、カイ

4

3 に答える 3

2

これらの文字列の大きさは? 現在利用可能なメモリの量を考えると、ブルート フォースが有効な方法かもしれません。

あなたは動く言葉について話しますが、文字の位置を保存します。単語の位置と、単語のインスタンスごとの履歴を保存してみませんか。巧妙にフライウェイト パターンを利用して、必要になるまでこれらのオブジェクトの複数のインスタンスを保存できることに注意してください。つまり、「文字列」オブジェクトは1つの「コンピューター」単語オブジェクトを保持しますが、その単語が133、245、667などの位置にあることを記録します(必要に応じて履歴を追加します)

于 2009-07-06T10:32:14.050 に答える
1

あなたが参照している問題は、正式には「文字列から文字列への修正問題」と呼ばれ、デルタ エンコーディングレーベンシュタイン距離に関連しています。 距離を計算するコードを次に示します (Java で記述されています) すべての差分コードがそこにあります。手順を追跡するコードを追加するだけで、それらを元に戻したり追跡したりできます。注: 単語または文字の「移動」は、一緒に出現する同じ単語の削除/挿入のペアになります。

これは、文字、単語、部分文字列の移動の両方で機能するはずです。

于 2009-07-06T10:31:49.293 に答える
0

効率性について強調する前に、エンベロープの計算を行います。それで問題がなく、コードがある場合は、プロファイラー/ストップウォッチで再確認できます。

Swing テキストの形式で既製のソリューションがあります。IIRCはEDTで(典型的なSwingスレッド敵対的な方法で)例外を発生させようとしますが、Swingコンテキストの外で使用できるはずです-それを確認したい場合があります。挿入および削除後もPosition内の文字位置を追跡するオブジェクトがあります。Document他に何もない場合は、それがどのように行われるかを示します。おそらく、Apache Harmony の実装には、ほとんどの一般ユーザーに適したライセンスが付属しています。

于 2009-07-06T10:32:15.127 に答える