2008-09-25 14 views
41

Ich müsste Diffs zwischen Java-Strings durchführen. Ich möchte in der Lage sein, einen String aus den ursprünglichen String- und Diff-Versionen neu zu erstellen. Hat jemand das in Java getan? Welche Bibliothek benutzt du?Wie führe ich Zeichenketten in Java aus?

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 
+0

Siehe auch http://stackoverflow.com/questions/479654/java-library-for-free-text-diff – Stewart

Antwort

44

Diese Bibliothek scheint den Trick zu tun: google-diff-match-patch. Es kann eine Patch-Zeichenfolge aus Unterschieden erstellen und den Patch erneut anwenden.

bearbeiten: Eine andere Lösung https://code.google.com/p/java-diff-utils/

+0

Das sind verschiedene Bibliotheken, FWIW – Kerinin

+4

Maven Repository für den Google-diff-match-Patch ist [dort] (https://bitbucket.org/cowwoc/google-diff-match-patch/wiki/Home). – fracz

+4

Die aktiv gepflegte Verzweigung von Java-Diff-Utils scheint https://github.com/bkromhout/java-diff-utils zu sein – koppor

19

Apache Commons hat String diff

org.apache.commons.lang.StringUtils

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

Sie der Rest des zweiten String zurückgibt, von denen sie zunächst unterscheidet sich von der ersten. Das ist nicht effizient genug für mich, da ich mit großen Texten arbeiten würde. Siehe: StringUtils.difference ("ab", "abxyz") -> "xyz" StringUtils.difference ("ab", "xyzab") -> "xyzab"; –

+1

Beachten Sie auch diese Frage: 'StringUtils.difference (" abc "," ") =" " ' StringUtils.difference ("abc", "abc") = "" – Alec

1

Mit den Levenshtein distance und Dekomprimierung der Bearbeitungsprotokolle aus der Matrix der Algorithmus aufbaut. Der Wikipedia-Artikel verlinkt auf einige Implementierungen, ich bin mir sicher, dass es eine Java-Implementierung unter gibt.

Levenshtein ist ein Spezialfall des Longest Common Subsequence Algorithmus, Sie möchten vielleicht auch einen Blick darauf werfen.

4

sein könnte wie Torsten sagt man

org.apache.commons.lang.StringUtils verwenden können;

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

Danke, aber getLevenshteinDistance gibt nur eine Ganzzahl zurück. Das ist nicht genug, um die Saiten neu aufzubauen. –

+0

@hstoerr du bist richtig Ich muss diesen Teil in der ursprünglichen Frage verpasst haben. Vor langer Zeit jetzt :) –

1

Wenn Sie mit den Unterschieden zwischen großen Datenmengen umgehen müssen und die Unterschiede effizient komprimiert, könnten Sie eine Java-Implementierung von xdelta versuchen, die wiederum implementiert RFC 3284 (VCDIFF) für binäre Diffs (sollte funktionieren mit Streichern auch).

4

Die Bibliothek java diff utills könnte nützlich sein.

+2

Das Repo https://github.com/bkromout/java-diff-utils/ gab indirekt vom ursprünglichen GitHub-Repository ab und wird besser gepflegt. Vielleicht können Sie sich dort zusammenschließen? – koppor

-4
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; 

    } 
    } 
+1

Nicht getesteter Klartextcode macht fast nie Sinn. Erstellen Sie ein Projekt auf einer FLOSS-Code-Hosting-Seite und stellen Sie dort die Code + -Tests bereit. –

Verwandte Themen