J'ai besoin d'effectuer des différences entre les chaînes Java. Je voudrais pouvoir reconstruire une chaîne en utilisant la chaîne d'origine et les versions de diff. Quelqu'un a-t-il fait cela en Java? Quelle bibliothèque utilisez-vous?
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
Cette bibliothèque semble faire l'affaire: google-diff-match-patch . Il peut créer une chaîne de patch à partir des différences et permettre de réappliquer le patch.
edit : Une autre solution pourrait être de https://code.google.com/p/Java-diff-utils/
Apache Commons a diff chaîne
org.Apache.commons.lang.StringUtils
StringUtils.difference("foobar", "foo");
La bibliothèque Java diff utils peut être utile.
Comme le dit Torsten, vous pouvez utiliser
org.Apache.commons.lang.StringUtils;
System.err.println(StringUtils.getLevenshteinDistance("foobar", "bar"));
Si vous devez gérer les différences entre de grandes quantités de données et les compresser efficacement, vous pouvez essayer une implémentation Java de xdelta, qui à son tour implémente la RFC 3284 (VCDIFF) pour les différences binaires ( devrait également fonctionner avec des chaînes).
Utilisez la distance Levenshtein et extrayez les journaux d'édition de la matrice que l'algorithme construit. L'article de Wikipédia renvoie à quelques implémentations, je suis sûr qu'il y a une implémentation Java parmi.
Levenshtein est un cas particulier de l'algorithme Longest Common Subsequence , vous pouvez également y jeter un œil.