Wie führe ich Zeichenketten in Java aus?

Ich muss Diffs zwischen Java-Strings durchführen. Ich möchte in der Lage sein, einen String mit den ursprünglichen String- und Diff-Versionen neu zu erstellen. Hat jemand das in Java gemacht? Welche Bibliothek benutzt du?

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 

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

    Bearbeiten : Eine andere Lösung könnte https://code.google.com/p/java-diff-utils/ sein.

    Apache Commons hat String diff

    org.apache.commons.lang.StringUtils

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

    Wie Torsten sagt, können Sie verwenden

    org.apache.commons.lang.StringUtils;

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

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

    Wenn Sie mit den Unterschieden zwischen großen Datenmengen umgehen und die Unterschiede effizient komprimieren müssen, können Sie eine Java-Implementierung von xdelta ausprobieren, die wiederum RFC 3284 (VCDIFF) für Binärdiffs implementiert (sollte auch mit Strings arbeiten).

    Verwenden Sie die Levenshtein-Distanz und extrahieren Sie die Bearbeitungsprotokolle aus der Matrix, die der Algorithmus erstellt. Der Wikipedia-Artikel verlinkt auf einige Implementierungen, ich bin sicher, dass es eine Java-Implementierung gibt.

    Levenshtein ist ein Spezialfall des Longest Common Subsequence- Algorithmus. Vielleicht möchten Sie sich das auch ansehen.

     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