2011-01-04 11 views
3

私のウェブサイトにバージョン履歴のタイプを実装したいと思います。文字列やオブジェクトキーを比較する方法が必要です。たとえば:2つの文字列またはオブジェクトを比較して差分を取得する

は、元の文字列/オブジェクトキー:迅速な茶色のキツネ 怠惰なウサギ

リビジョンを飛び越え:

改訂文字列/オブジェクトキーが速く茶色のキツネは、を飛び越えます追加します私は私の時間でのみリビジョンを保存したい

怠惰なウサギ削除えーistoryテーブル。私はどこから始めるべきか本当に分からないので、アプローチをどうやって進めるか、アプローチについてのアドバイスは本当に感謝しています。

私はfind()関数を認識していますが、それは主な候補ですと思っていますが、文字列を "卸売り"と比較するため、ソリューションとして視覚化する方法はわかりません。

+0

@oragepipsが指摘しているように、これは簡単な問題ではありません。たとえば、あなたの例では、 "brown fox jumped ov"が追加され、 "brown fox"が削除され、 "lazy rabbit"が追加されたと言っても間違いありません。サードパーティのユーティリティを見てください。 –

答えて

7

あなたは非常にお勧めします。私はdiffingアルゴリズム(私はそのような質問をタグ付けしました)が欲しいですではないあなた自身を書くようにしてください。私は試してみましたが、失敗しました.NP完全な問題であり、あなたの心を包み込むのは簡単ではありません。代わりに、diff-match-patchをチェックしてください。これには、クライアント用のJavaScriptとJava実装(demo)またはサーバー側の処理が含まれています。 HTML差分を行う必要がある場合は、代わりにdaisydiffを見てください。ただし、HTML/XMLの比較は本当に苦しい経験です(see this page for some reasons why)。

おそらく、diffingのお父さんはGNU diffであり、Java implementation(「GNU Diff for Java」)もあります。このアルゴリズムはdiff-match-patch(dmp)よりも最適化されていますが、dmpは常に改善されているようですが、非常に大きな文字列(たとえばメガバイト)を比較する必要がある場合はGNUアルゴリズムが有効でしょう。

+0

orangepips、これは完璧です。唯一の問題はJavaであり、ColdFusionアプリケーションにどのように統合するのかという手がかりがないことです!チュートリアルを覚えている場合は、共有してください。 – Mohamad

+0

いいえ、.zipにはJavaScriptのバージョンがあり、使用例を示す.htmlファイルがあります。私が含まれているデモリンクは、JavaScriptのバージョンを使用しています。 – orangepips

+1

@Mel、あなたのCF Web Devのガイドをチェックしてください。一般的にCFアプリケーションにJavaを組み込むのはとても簡単です – Henry

1

thisをショットします。

+0

Todd、これはすばらしい、たくさんのおかげです。 – Mohamad

+0

幸運。それがあなたのために働く場合は、私たちにお知らせください。 –

+0

だから私はこれをダウンロードし、それをテストしました。 compareText()メソッドを使用して、この質問のテキストを使用することはできません。 compareLine()を使うと結果が得られます(私はそれが正しいと仮定します)。しかし、私が何かが欠けていない限り、これは問題を解決するにはバグが多いようです。これは私の答えのポイントに直接話していると思う、それはうまく解決するのが難しい問題だ、と私はここにリンクされているソリューションはそうは思わない。 – orangepips

1

OK、何について約this?あなたが望むように普通の古い文字列を使っているかどうかは分かりませんが、Java統合ビット(これはすでに書かれているので)に取り組む方法がわからないという懸念に対処しているようです。少なくとも書く方向に向けるべきです。

+0

トッド、それは知っておいしいです。私はこれを調べます。私は唯一の違いを保存する必要はないことに気付きました。私はちょうど修正された文字列全体を保存し、クライアント側の変更を表示するためにdiff-match-patchのJSバージョンを使用する必要があります。 – Mohamad

+0

がんばろう。 –