我需要在Java字符串之间执行Diffs。我希望能够使用原始字符串和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
有帮助吗?

解决方案

这个库似乎可以解决问题: google-diff-match-patch 。它可以根据差异创建补丁字符串,并允许重新应用补丁。

修改:另一种解决方案可能是 https: //code.google.com/p/java-diff-utils/

其他提示

Apache Commons有String diff

org.apache.commons.lang.StringUtils

StringUtils.difference("foobar", "foo");

正如托尔斯滕所说,你可以使用

org.apache.commons.lang.StringUtils;

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

java diff utills 库可能会有用。

如果你需要处理大量数据之间的差异并且有效地压缩差异,你可以尝试xdelta的Java实现,后者又为二进制差异实现RFC 3284(VCDIFF)(也应该使用字符串)

使用 Levenshtein距离并从算法构建的矩阵中提取编辑日志。维基百科的文章链接到几个实现,我确信其中有一个Java实现。

Levenshtein是最长公共子序列算法的一个特例,您可能也想要看看那个。

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;

   }
   }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top