Pregunta

Necesito realizar Diffs entre cadenas de Java. Me gustaría poder reconstruir una cadena usando la cadena original y las versiones de diferencias. ¿Alguien ha hecho esto en Java? ¿Qué biblioteca utilizas?

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
¿Fue útil?

Solución

Esta biblioteca parece hacer el truco: google-diff-match-patch . Puede crear una cadena de parches a partir de las diferencias y permitir volver a aplicar el parche.

editar : otra solución podría ser https: //code.google.com/p/java-diff-utils/

Otros consejos

Apache Commons tiene una diferencia de cadena

org.apache.commons.lang.StringUtils

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

Como dice Torsten, puedes usar

org.apache.commons.lang.StringUtils;

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

La biblioteca java diff utills puede ser útil.

Si necesita lidiar con las diferencias entre grandes cantidades de datos y comprimirlas de manera eficiente, puede probar una implementación Java de xdelta, que a su vez implementa RFC 3284 (VCDIFF) para diferencias binarias (también debería funcionar con cadenas) .

Use Levenshtein distance y extraiga los registros de edición de la matriz que el algoritmo acumula. El artículo de Wikipedia enlaza con un par de implementaciones, estoy seguro de que hay una implementación de Java entre.

Levenshtein es un caso especial del algoritmo Subsecuencias Comunes Más Largas , también podría desear Echa un vistazo a eso.

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;

   }
   }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top