2016-07-04 9 views
-3

Kann jemand den Code für Delta-Codierung für Strings setzen.Delta-Codierung - Strings (Programmierlogik - keine spezifische Sprache)

Wenn zum Beispiel die anfängliche Zeichenfolge

"Katzen und Hunde"

und später die Zeichenfolge

"Katzen und Hunde"

Ich sollte in der Lage sein, den Unterschied zwischen der Zeichenfolge versi zu bekommen sehr effizient. Wenn jemand den Code hier setzen kann, so dass sehr große Absätze mit Delta-Codierung mit sehr wenig Daten gesendet werden können.

+0

Keine Ahnung, was Sie fragen. Vielleicht solltest du Google "diff" nennen. Wenn du das meinst..wohl, das ist alles andere als trivial, auch wenn es für das menschliche Auge so aussieht! Siehe [hier] (http://stackoverflow.com/questions/24887238/how-to-compare-two-rich-text-box-contents-and-highlight-the-characters-that-are/24970638?s=1 (0.2755 # 24970638) für die Implementierung, die klarstellen sollte, dass es nichts "sehr effizientes" Diffing gibt und niemand könnte "Code hier setzen". – TaW

+0

Ich bin auf der Suche nach einer Logik, um die endgültige Zeichenfolge mit dem zu konstruieren alter String und das Delta (Unterschied zwischen der alten und der neuen Version). wobei Delta möglicherweise klein sein muss, damit ich große Absätze leicht übertragen kann. –

+0

Viel Glück. Komm zurück, wenn du Code hast, benötigst du Hilfe mit .. – TaW

Antwort

1

Ich fand die Antwort, ich wollte es allen teilen.

var oldString = "This is just a sample of string to test the delta encoding. Infact, with my own login.dsfdsfdsfdsfsdfsdfdsfdsfsdfsdfds dsfds fds fddsf"; 
var newString = "dsfdsThissdf is just a sample of string to test X the dedsfdsflta encoding sdfds decoding. Infact, with my own sadsadsadsad" 
var result = ""; 

var changes = getChanges(oldString, newString); 
var string = getOriginal(oldString, changes); 

function getChanges(os, ns) { 
    var addedIndex = false; 
    var changes = []; 
    var obj = []; 
    var oi = 0, ni = 0; 
    while (oi < oldString.length && ni < newString.length) { 
     if (newString.charAt(ni) != oldString.charAt(oi)) { 
      if (!addedIndex) { 
       obj.push(oi); 
       obj.push(newString.charAt(ni)); 
       addedIndex = true; 
      } 
      else { 
       obj[1] += newString.charAt(ni); 
      } 
      ni++; 
     } 
     else { 
      if (addedIndex) { 
       changes.push(obj); 
       obj = []; 
       addedIndex = false; 
      } 
      oi++; 
      ni++; 
     } 
    }; 
    if (addedIndex) { 
     changes.push(obj); 
     obj = []; 
     addedIndex = false; 
    } 
    obj = []; 
    if (ni == newString.length) { 
     obj.push(-1 * oi); 
     changes.push(obj); 
    } 
    if (oi == oldString.length) { 
     obj.push(ni); 
     obj.push(newString.substring(ni)); 
     changes.push(obj); 
    } 
    return changes; 
} 

function getOriginal(os, changes) { 
    var result = os; 
    for (var i = changes.length - 1; i >= 0 ; i--) { 
     if (changes[i][0] < 0) { 
      result = result.substring(0, -1 * changes[i][0]); 
     } 
     else { 
      result = result.substring(0, changes[i][0]) + changes[i][1] + result.substring(changes[i][0]); 
     } 
    }; 
    return result; 
} 

console.log(string); 
console.log(newString); 
Verwandte Themen