Come eseguire i diff di stringa in Java?
Domanda
Devo eseguire Diffs tra le stringhe Java. Vorrei poter ricostruire una stringa usando la stringa originale e le versioni diff. Qualcuno l'ha fatto in Java? Quale libreria usi?
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
Soluzione
Questa libreria sembra fare il trucco: google-diff-match-patch-patch . Può creare una stringa di patch dalle differenze e consentire di riapplicare la patch.
modifica : un'altra soluzione potrebbe essere https: //code.google.com/p/java-diff-utils/
Altri suggerimenti
Apache Commons ha String diff
org.apache.commons.lang.StringUtils
StringUtils.difference("foobar", "foo");
Come dice Torsten puoi usare
org.apache.commons.lang.StringUtils;
System.err.println(StringUtils.getLevenshteinDistance("foobar", "bar"));
La libreria java diff utills potrebbe essere utile.
Se devi affrontare le differenze tra grandi quantità di dati e comprimere le differenze in modo efficiente, puoi provare un'implementazione Java di xdelta, che a sua volta implementa RFC 3284 (VCDIFF) per le differenze binarie (dovrebbe funzionare anche con le stringhe) .
Usa la Levenshtein distance ed estrai i log di modifica dalla matrice che crea l'algoritmo. L'articolo di Wikipedia si collega a un paio di implementazioni, sono sicuro che ci sia un'implementazione Java tra in.
Levenshtein è un caso speciale dell'algoritmo Longest Common Subsequence , potresti anche voler dai un'occhiata a questo.
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;
}
}