diff
Stack Overflow の質問の改訂履歴などの機能を実装するにはどうすればよいですか?
5 に答える
ここに、diff アルゴリズムの実装のJavaScript の例があります。
に基づく:
P. Heckel、ファイル間の相違点を分離するための手法 Comm. ACM、21、(4)、264--268 (1978)。
実装自体には 2 つの関数があり、そのうちの 1 つを使用することをお勧めします。
diffString( String oldFile, String newFile )
このメソッドは 2 つの文字列を取り、それぞれの違いを計算します。最終的な結果は、HTML でマークアップされた「newFile」です (oldFile からの削除と newFile への追加の両方を示すため)。
FreeBSD diff ユーティリティのコードを見つけて、それをベースラインとして使用します。ライセンスがこの種のコピーを許可している場合、車輪を再発明しても意味がありません。
ほとんどのアルゴリズムは LCS: Longest common subsequenceに基づいています。効率的な方法で実装することは明らかではありません。おそらく、さまざまな言語のさまざまな実装がネット上で見つかるでしょう。
唯一の方法は、2 つの文字列を形成する各文字を比較することだと思います。このようなもの :
void diff(String first,String second) {
int biggest = (first.length() > second.length()) ? first.length() : second.length();
for(int i = 0;i < biggest;i++) {
//compare each char from the longest string with each char from the shorter
// do something with them if they're not equal
}
}
これは、私がそれを行う方法の単なるスケッチです。すべては、データで何をしたいかによって異なります。
改訂履歴が必要な場合は、差分から始めて車輪を再発明しないでください。すべてをバージョン管理に投入し、その差分とログ機能を使用してください。単純で線形の履歴の場合、RCSと同じくらい単純なものが実行されます。または、最新の大砲を投げてgitを使用することもできます。
ほとんどの diff ユーティリティは、行ごとの diff を行います。スタック オーバーフローは、単語ごとの diff を実行します。そのためにはwdiffのようなものが必要です。ほとんどのバージョン管理システムでは、diff ユーティリティをプラグインできます。箱から出してすぐに、git diff --color-words
ここで行われていることに非常に近くなります。設定を少しいじるだけで、きれいな Web ページにすることができる何かを吐き出すことができるでしょう。