2011-01-04 3 views
3

Ich möchte eine Art Versionsgeschichte auf meiner Website implementieren und brauche eine Möglichkeit, Strings oder Objektschlüssel zu vergleichen. Zum Beispiel:Vergleicht man zwei Strings oder Objekte und erhält den Unterschied zurück

Original-String/Objektschlüssel: Je schneller braune Fuchs

Arbeiteter String/Objektschlüssel: Der schnelle braune Fuchs über die faulen Kaninchen sprang

Revision: hinzugefügt sprang über die faul Kaninchen entfernt er

Ich mag würde nur die Revision in meinem h sparen Vergangenheitstabelle. Ich weiß nicht wirklich, wo ich anfangen soll, also wären Ideen, wie man mich zum Laufen bringt, oder Ratschläge für den Ansatz sehr willkommen.

Ich kenne die find() Funktion und ich vermute, dass es ein Hauptkandidat für den Einsatz ist, aber ich weiß nicht, wie man es als eine Lösung visualisieren, da es Strings "Großhandel" sozusagen vergleicht.

+0

Wie @oragepips darauf hingewiesen hat, ist dies kein einfaches Problem. Zum Beispiel wäre es in Ihrem Beispiel auch richtig (wenn auch vielleicht weniger) zu sagen, dass "brauner Fuchs gesprungen" wurde, "brauner Fuchs" entfernt wurde und "der faule Hase" hinzugefügt wurde. Schauen Sie sich die Dienstprogramme von Drittanbietern an. –

Antwort

7

Sie wollen einen Diffing-Algorithmus (Ich habe die Frage als solche markiert), die ich Ihnen sehr empfehlen nicht versuchen Sie, sich selbst zu schreiben. Ich habe es versucht - und gescheitert -, weil es ein NP-vollständiges Problem ist und nicht leicht, sich daran zu erinnern. Überprüfen Sie stattdessen diff-match-patch, das über eine JavaScript- und eine Java-Implementierung für Client (demo) oder serverseitige Verarbeitung verfügt. Wenn Sie HTML-Differenzierung tun müssen, schauen Sie sich stattdessen daisydiff an, obwohl vorgewarntes HTML/XML-Diffing wirklich eine schmerzhafte Erfahrung ist (see this page for some reasons why).

Wahrscheinlich der Grand-Daddy von Diffing ist GNU diff, die auch eine Java implementation (finden Sie "GNU Diff für Java"). Dieser Algorithmus ist besser optimiert als diff-match-patch (dmp), obwohl sich dmp ständig zu verbessern scheint. Wenn Sie also sehr große Strings (z. B. Megabyte) vergleichen müssen, ist der GNU-Algorithmus wahrscheinlich eine bessere Wahl.

+0

orangepips, das ist perfekt. Das einzige Problem ist, dass es Java ist und ich keine Ahnung habe, wie ich es in eine ColdFusion-App integrieren kann! Wenn Sie irgendwelche Tutorials im Sinn haben, teilen Sie es bitte mit. – Mohamad

+0

Nein, es gibt eine JavaScript-Version in der .zip-Datei zusammen mit einer .html-Datei, die Beispielverwendung bietet. Der Demo-Link, den ich eingebunden habe, verwendet die JavaScript-Version. – orangepips

+1

@Mel, überprüfen Sie Ihr CF Web Dev Handbuch, es ist super einfach, Java in eine CF-App im Allgemeinen zu integrieren – Henry

1

Gib this einen Schuss.

+0

Todd, das ist großartig, vielen Dank. – Mohamad

+0

Viel Glück. Bitte lassen Sie uns wissen, ob es für Sie funktioniert. –

+0

Also habe ich das heruntergeladen und getestet. Die Verwendung des Textes aus der Frage funktioniert nicht mit der compareText() -Methode. Die Verwendung von compareLine() liefert ein Ergebnis (ich gehe davon aus, dass es gültig ist), aber wenn ich etwas nicht vermisse, scheint dies zu fehlerhaft zu sein, um das Problem zu lösen. Denken Sie, dies spricht direkt zu dem Punkt in meiner Antwort, es ist ein schweres Problem, gut zu lösen, und ich glaube nicht, dass die hier verlinkte Lösung dies tut. – orangepips

1

OK, was ist dann mit this dann? Ich bin mir nicht sicher, ob es einfache alte Zeichenfolgen gibt, wie Sie möchten, aber es scheint Ihre Bedenken auszuräumen, dass Sie nicht wissen, wie man die Java-Integrationsbits anpackt (da es bereits geschrieben ist). Sollte dich zumindest in die Schreibrichtung weisen.

+0

Todd, das ist großartig zu wissen. Ich werde das untersuchen. Ich erkannte, dass ich die einzigen Unterschiede nicht speichern muss. Ich sollte nur die gesamte überarbeitete Zeichenfolge speichern und die JS-Version von diff-match-patch verwenden, um die Änderungen auf der Clientseite anzuzeigen. – Mohamad

+0

cool. Viel Glück. –

Verwandte Themen