JavaRush /Blog Java /Random-PL /Opcja rozwiązania problemu poziom 19 zadanie 16 (monitoro...
Anton Stezhkin
Poziom 41

Opcja rozwiązania problemu poziom 19 zadanie 16 (monitorowanie zmian)

Opublikowano w grupie Random-PL

Tło:

Rozwiązałem ten problem przez bardzo długi czas . W nim konieczne było porównanie 2 wersji pliku i znalezienie zmian. Postanowiłem wyodrębnić zawartość plików w postaci tablic i porównać tablice. Potem długo byłem głupi i popełniałem błędy, aż w końcu narysowałem tablice na kartce w pudełku. Właściwie wcześniej szukałem innego rozwiązania. Ale to jest tak skomplikowane, że nie mogłem tego opanować :) Dodatkowo istniały 2 różne algorytmy na wypadek, gdyby stary plik był dłuższy i nowy plik był dłuższy. Nie lubiłem tego.

Istota mojego rozwiązania:

Istnieją 2 identyczne tablice. W całym tekście będę je nazywał „nową tablicą” i „starą tablicą”. Do każdego z nich można wstawić nowe elementy. Te. Za tablicę referencyjną uważa się tę, która odpowiada zawartości starego pliku ze wszystkimi usunięciami. Zawartość starego i nowego pliku traktowana jest jako odniesienie z wstawkami. Obie tablice (zawartość starej i nowej) przeglądamy w pętli. A jeśli wykryjemy wstawienie w którymś z nich, to pomijamy jeden krok, aby te same elementy porównywanych tablic znów znalazły się w pobliżu.

Algorytm:

Zmienne: i - indeks komórki tablicy z zawartością STAREGO pliku. nI - indeks komórki tablicy z zawartością pliku NEW. Jeżeli elementy tablic są różne, zapisujemy je do zmiennych tymczasowych: oldMismatch – element z tablicy skumulowanej newMismatch – element z nowej tablicy Podczas iteracji po elementach tablicy możliwe są następujące przypadki:
  1. zmienne oldMismatch i newMismatch są puste. Elementy w obu tablicach są takie same. Wpisz Type.SAME na listę. Zacząć robić.

  2. zmienne oldMismatch i newMismatch są puste. Elementy w obu tablicach NIE są takie same. Zapisujemy wartość ze starej do oldMismatch, z nowej do newMismatch. Zacząć robić.

  3. zmienne oldMismatch i newMismatch NIE są puste. Porównujemy je z bieżącymi elementami tablicy.

    Wyciągnijmy wnioski. Wyniki zapisujemy na listę (zmienna wierszy). Pomijamy krok pętli dla jednej z tablic.

    1. 3.1 oldMismatch jest równy bieżącemu elementowi tablicy NEW. Oznacza to, że do pliku dodano linię.

      Wartość tego ciągu jest przechowywana w newMismatch. Zapiszmy to w ten sposób.

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

      Ponieważ w tablicy znajduje się dodatkowy element zawierający zawartość nowego pliku, należy przesunąć nowy element tablicy o 1 do przodu względem starego.

      Dlatego tablica OLD pomija 1 krok pętli.

      I--;

    2. 3.2 newMismatch jest równy bieżącemu elementowi OLD tablicy. Oznacza to, że z pliku usunięto linię. Zapiszmy to.

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

      W tablicy OLD znajduje się dodatkowy element. Oznacza to, że tablica NEW pomija 1 krok pętli.

      nI--;

  4. Przetwarzanie końca tablicy. I teraz dotarliśmy do końca starej tablicy. Możliwych sytuacji jest kilka

    1. 4.1 - ArrayIndexOutOfBoundsException - nowa tablica jest krótsza od starej. Odnotowujemy, że ostatnia linia pliku została usunięta.

    2. 4.2 - Pozostaje ostatni element nowego układu, który nie jest objęty naszą uwagą. Zapisujemy to jako dodane.

    3. 4.3 - Zmienne oldMismatch i newMismatch nie są puste. Zapisujemy:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS – nie zapomnij zresetować zmiennych i śledzić zmienną nI.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION