Java에서 String Diff를 수행하는 방법은 무엇입니까?
문제
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
해결책
이 라이브러리는 트릭을 수행하는 것 같습니다. 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");
Torsten이 말했듯이 사용할 수 있습니다
org.apache.commons.lang.stringutils;
System.err.println(StringUtils.getLevenshteinDistance("foobar", "bar"));
그만큼 Java Diff Utills 라이브러리가 유용 할 수 있습니다.
많은 양의 데이터 간의 차이를 다루고 차이가 효율적으로 압축되어야한다면, Xdelta의 Java 구현을 시도 할 수 있으며, 이는 바이너리 차이에 대한 RFC 3284 (VCDIFF)를 구현할 수 있습니다 (문자열에서도 작동해야 함).
사용 Levenshtein 거리 매트릭스에서 편집 로그를 추출하여 알고리즘이 쌓입니다. Wikipedia 기사는 몇 가지 구현과 연결되어 있습니다. IN 중에 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;
}
}