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:-
zmienne oldMismatch i newMismatch są puste. Elementy w obu tablicach są takie same. Wpisz Type.SAME na listę. Zacząć robić.
-
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ć.
-
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.
-
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--;
-
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--;
-
-
Przetwarzanie końca tablicy. I teraz dotarliśmy do końca starej tablicy. Możliwych sytuacji jest kilka
-
4.1 - ArrayIndexOutOfBoundsException - nowa tablica jest krótsza od starej. Odnotowujemy, że ostatnia linia pliku została usunięta.
-
4.2 - Pozostaje ostatni element nowego układu, który nie jest objęty naszą uwagą. Zapisujemy to jako dodane.
-
4.3 - Zmienne oldMismatch i newMismatch nie są puste. Zapisujemy:
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
-
GO TO FULL VERSION