Comment effectuer des diffs de chaîne en Java?

Je dois effectuer des diffs entre les chaînes Java. Je voudrais pouvoir reconstruire une chaîne en utilisant les versions originales de chaîne et de diff. Est-ce que quelqu’un l’a fait en Java? Quelle bibliothèque utilisez-vous?

Ssortingng a1; // This can be a long text Ssortingng a2; // ej. above text with spelling corrections Ssortingng a3; // ej. above text with spelling corrections and an additional sentence Diff diff = new Diff(); Ssortingng differences_a1_a2 = Diff.getDifferences(a,changed_a); Ssortingng differences_a2_a3 = Diff.getDifferences(a,changed_a); Ssortingng[] diffs = new Ssortingng[]{a,differences_a1_a2,differences_a2_a3}; Ssortingng new_a3 = Diff.build(diffs); a3.equals(new_a3); // this is true 

Cette bibliothèque semble faire l’affaire: google-diff-match-patch . Il peut créer un patch à partir des différences et permettre de réappliquer le patch.

edit : Une autre solution pourrait être https://code.google.com/p/java-diff-utils/

Apache Commons a diff diff

org.apache.commons.lang.SsortingngUtils

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

Comme Torsten, vous pouvez utiliser

org.apache.commons.lang.SsortingngUtils;

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

La bibliothèque d’ applications Java diff peut être utile.

Si vous avez besoin de gérer les différences entre de grandes quantités de données et que les différences sont efficacement compressées, vous pouvez essayer une implémentation Java de xdelta, qui implémente à son tour la RFC 3284 (VCDIFF) pour les diffs binarys.

Utilisez la distance Levenshtein et extrayez les journaux d’édition de la masortingce que l’algorithme crée. L’article de Wikipedia est lié à quelques implémentations, je suis sûr qu’il y a une implémentation Java parmi.

Levenshtein est un cas particulier de l’algorithme de la plus longue sous – séquence commune , vous pourriez également vouloir y jeter un coup d’oeil.

 public class Ssortingngdiff { public static void main(Ssortingng args[]){ System.out.println(strcheck("sum","sumsum")); } public static Ssortingng strcheck(Ssortingng str1,Ssortingng 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.subssortingng(num); } else{ return str2.subssortingng(num); } } public static int diffcheck1(Ssortingng str1,Ssortingng str2) { int i; Ssortingng str; Ssortingng strn; if(str1.length()>str2.length()){ str=str1; strn=str2; } else{ str=str2; strn=str1; } for(i=0;i