如何在Java中执行stringDiffs?
我需要在Javastring之间执行Diffs。 我想能够从原始string和diff版本重build一个string。 有没有人在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
这个库似乎做的伎俩: 谷歌差异匹配补丁 。 它可以根据差异创build补丁串,并允许重新应用补丁。
编辑 :另一种解决scheme可能是https://code.google.com/p/java-diff-utils/
Apache Commons有String diff
org.apache.commons.lang.StringUtils
StringUtils.difference("foobar", "foo");
如Torsten说,你可以使用
org.apache.commons.lang.StringUtils;
System.err.println(StringUtils.getLevenshteinDistance("foobar", "bar"));
java差异库可能是有用的。
使用Levenshtein距离,并从algorithm构build的matrix中提取编辑日志。 维基百科的文章链接到了几个实现,我确定其中有一个Java实现。
Levenshtein是最长的公共子序列algorithm的一个特例,你可能也想看看这个。
如果您需要处理大量数据之间的差异,并有效地压缩差异,则可以尝试使用xdelta的Java实现,该实现继而实现用于二进制比较的RFC 3284(VCDIFF)(也应该使用string)。
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; } }