web-dev-qa-db-fra.com

Comment effectuer des différences de chaîne en Java?

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
47
Sergio del Amo

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/

47
bernardn

Apache Commons a diff chaîne

org.Apache.commons.lang.StringUtils

StringUtils.difference("foobar", "foo");
22
Paul Whelan

La bibliothèque Java diff utils peut être utile.

4
dnaumenko

Comme le dit Torsten, vous pouvez utiliser

org.Apache.commons.lang.StringUtils;

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

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).

1
Alexander

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.

0
Torsten Marek