56

Java 文字列間で Diff を実行する必要があります。元の文字列と差分バージョンを使用して文字列を再構築できるようにしたいと考えています。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
4

8 に答える 8

53

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

編集:別の解決策はhttps://code.google.com/p/java-diff-utils/

于 2008-09-25T10:41:37.537 に答える
26

Apache Commons には String diff があります

org.apache.commons.lang.StringUtils

StringUtils.difference("foobar", "foo");
于 2008-09-25T10:22:22.983 に答える
4

javadiffutillsライブラリが役立つ場合があります

于 2009-07-18T08:36:27.573 に答える
3

Torstenが言うように、使用できます

org.apache.commons.lang.StringUtils;

System.err.println(StringUtils.getLevenshteinDistance("foobar", "bar"));
于 2008-09-25T10:46:16.153 に答える
1

大量のデータの違いに対処し、違いを効率的に圧縮する必要がある場合は、xdelta の Java 実装を試すことができます。これは、バイナリ差分用に RFC 3284 (VCDIFF) を実装します (文字列でも動作するはずです)。

于 2008-09-25T14:36:44.540 に答える
0

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

レーベンシュタインは、 Longest Common Subsequenceアルゴリズムの特殊なケースです。これも参照してください。

于 2008-09-25T10:40:02.300 に答える
-7
public class Stringdiff {
public static void main(String args[]){
System.out.println(strcheck("sum","sumsum"));
}
public static String strcheck(String str1,String str2){
    if(Math.abs((str1.length()-str2.length()))==-1){
        return "Invalid";
    }
    int num=diffcheck1(str1, str2);
    if(num==-1){
        return "Empty";
    }
    if(str1.length()>str2.length()){
        return str1.substring(num);
    }
    else{
        return str2.substring(num);
    }

}

public static int diffcheck1(String str1,String str2)
{
    int i;
    String str;
    String strn;
    if(str1.length()>str2.length()){
        str=str1;
        strn=str2;
    }
    else{
        str=str2;
        strn=str1;
    }
    for(i=0;i<str.length() && i<strn.length();i++){
            if(str1.charAt(i)!=str2.charAt(i)){
                return i;
            }
    }
        if(i<str1.length()||i<str2.length()){
            return i;
        }

    return -1;

   }
   }
于 2016-11-29T18:30:26.300 に答える