web-dev-qa-db-ja.com

Javaで文字列の差分を実行する方法は?

Java文字列の間の差分を実行する必要があります。元の文字列と差分バージョンを使用して文字列を再構築できるようにしたいと思います。

String a1; // This can be a long text
String a2; // ej. above text with spelling corrections
String a3; // ej. above text with spelling corrections and an additional sentence

Diff diff = new Diff();
String differences_a1_a2 = Diff.getDifferences(a,changed_a);
String differences_a2_a3 = Diff.getDifferences(a,changed_a);    
String[] diffs = new String[]{a,differences_a1_a2,differences_a2_a3};
String new_a3 = Diff.build(diffs);
a3.equals(new_a3); // this is true
47
Sergio del Amo

このライブラリはトリックを行うようです: google-diff-match-patch 。差分からパッチ文字列を作成し、パッチを再適用できます。

edit:別の解決策は https://code.google.com/p/Java-diff-utils/

47
bernardn

Apache CommonsにはString diffがあります

org.Apache.commons.lang.StringUtils

StringUtils.difference("foobar", "foo");
22
Paul Whelan

Java diff utils ライブラリが役立つ場合があります。

4
dnaumenko

Torstenが言うように、あなたは使うことができます

org.Apache.commons.lang.StringUtils;

System.err.println(StringUtils.getLevenshteinDistance("foobar", "bar"));
4
Paul Whelan

大量のデータの違いに対処し、その違いを効率的に圧縮する必要がある場合は、Javaのxdeltaの実装を試してみてください。文字列でも動作するはずです)。

1
Alexander

レーベンシュタイン距離 を使用して、アルゴリズムが構築するマトリックスから編集ログを抽出します。ウィキペディアの記事はいくつかの実装にリンクしていますが、中にはJava実装があります.

レーベンシュタインは、 最長共通部分列 アルゴリズムの特殊なケースです。これもご覧ください。

0
Torsten Marek