JavaRush /Java-Blog /Random-DE /Option zur Lösung des Problems Level 19 Aufgabe 16 (Änder...
Anton Stezhkin
Level 41

Option zur Lösung des Problems Level 19 Aufgabe 16 (Änderungen überwachen)

Veröffentlicht in der Gruppe Random-DE

Hintergrund:

Ich habe dieses Problem sehr lange gelöst . Darin war es notwendig, zwei Versionen der Datei zu vergleichen und Änderungen zu finden. Ich habe beschlossen, den Inhalt der Dateien in Form von Arrays zu extrahieren und die Arrays zu vergleichen. Dann war ich lange dumm und habe Fehler gemacht und am Ende habe ich Arrays auf ein Blatt Papier in einer Schachtel gezeichnet. Eigentlich habe ich mir zuvor eine andere Lösung angesehen. Aber es ist so kompliziert, dass ich es nicht beherrschen konnte :) Außerdem gab es zwei verschiedene Algorithmen für den Fall, dass die alte Datei länger ist und für den Fall, dass die neue Datei länger ist. Ich mochte es nicht.

Der Kern meiner Lösung:

Es gibt 2 identische Arrays. Im gesamten Text werde ich sie „neues Array“ und „altes Array“ nennen. Und in jedes davon können neue Elemente eingefügt werden. Diese. Als Referenzarray gilt dasjenige, das dem Inhalt der alten Datei mit allen Löschungen entspricht. Der Inhalt der alten und neuen Datei wird bei Einfügungen als Referenz behandelt. Wir durchlaufen beide Arrays (den Inhalt des alten und des neuen) in einer Schleife. Und wenn wir in einem von ihnen eine Einfügung erkennen, dann überspringen wir einen Schritt, sodass die gleichen Elemente der verglichenen Arrays wieder in der Nähe sind.

Algorithmus:

Variablen: i – Index der Array-Zelle mit dem Inhalt der OLD-Datei. nI – Index der Array-Zelle mit dem Inhalt der NEW-Datei. Wenn sich die Elemente der Arrays unterscheiden, schreiben wir sie in temporäre Variablen: oldMismatch – ein Element aus einem gestapelten Array newMismatch – ein Element aus einem neuen Array Bei der Iteration über Array-Elemente sind folgende Fälle möglich:
  1. Die Variablen oldMismatch und newMismatch sind leer. Die Elemente in den beiden Arrays sind gleich. Schreiben Sie Type.SAME in die Liste. Fortfahren.

  2. Die Variablen oldMismatch und newMismatch sind leer. Die Elemente in den beiden Arrays sind NICHT gleich. Wir schreiben den Wert vom alten in oldMismatch, vom neuen in newMismatch. Fortfahren.

  3. Die Variablen oldMismatch und newMismatch sind NICHT leer. Wir vergleichen sie mit den aktuellen Elementen des Arrays.

    Lassen Sie uns Schlussfolgerungen ziehen. Die Erkenntnisse schreiben wir in eine Liste (Linienvariable). Wir überspringen den Schleifenschritt für eines der Arrays.

    1. 3.1 oldMismatch ist gleich dem aktuellen Element des NEW-Arrays. Dies bedeutet, dass der Datei eine Zeile hinzugefügt wurde.

      Der Wert dieser Zeichenfolge wird in newMismatch gespeichert. Schreiben wir es so auf.

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));

      Da das Array ein zusätzliches Element enthält, das den Inhalt der neuen Datei enthält, müssen Sie das neue Array-Element relativ zum alten um 1 Element nach vorne verschieben.

      Daher überspringt das OLD-Array einen Schleifenschritt.

      ich--;

    2. 3.2 newMismatch ist gleich dem aktuellen Element des OLD-Arrays. Dies bedeutet, dass eine Zeile aus der Datei entfernt wurde. Schreiben wir es auf.

      lines.add(new LineItem(Type.REMOVED, oldMismatch));
       lines.add(new LineItem(Type.SAME, newMismatch));

      Es gibt ein zusätzliches Element im OLD-Array. Das bedeutet, dass das NEW-Array einen Schleifenschritt überspringt.

      nI--;

  4. Verarbeiten des Endes des Arrays. Und jetzt sind wir am Ende der alten Reihe angelangt. Es gibt mehrere mögliche Situationen

    1. 4.1 – ArrayIndexOutOfBoundsException – das neue Array ist kürzer als das alte. Wir notieren, dass die letzte Zeile der Datei gelöscht wurde.

    2. 4.2 – Das letzte Element des neuen Arrays bleibt erhalten und wird von unserer Aufmerksamkeit nicht abgedeckt. Wir erfassen es als hinzugefügt.

    3. 4.3 – Die Variablen oldMismatch und newMismatch sind nicht leer. Wir schreiben auf:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS: Vergessen Sie nicht, die Variablen zurückzusetzen und die nI-Variable im Auge zu behalten.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION