문제

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;

   }
   }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top