Sfondo:
Ho risolto questo problema per molto tempo . In esso è stato necessario confrontare 2 versioni del file e trovare le modifiche. Ho deciso di estrarre il contenuto dei file sotto forma di array e confrontare gli array. Poi sono stato stupido per molto tempo e ho commesso degli errori e alla fine ho disegnato delle matrici su un pezzo di carta in una scatola. In realtà, prima di questo ho cercato un'altra soluzione. Ma è così complicato che non sono riuscito a padroneggiarlo :) Inoltre, c'erano 2 algoritmi diversi nel caso in cui il vecchio file fosse più lungo e se il nuovo file fosse più lungo. Non mi è piaciuto.Il succo della mia soluzione:
Ci sono 2 array identici. In tutto il testo li chiamerò “nuovo array” e “vecchio array”. E in ognuno di essi possono essere inseriti nuovi elementi. Quelli. L'array di riferimento è considerato quello corrispondente al contenuto del vecchio file con tutte le eliminazioni. Il contenuto del vecchio e del nuovo file viene trattato come un riferimento con inserti. Esaminiamo entrambi gli array (il contenuto del vecchio e del nuovo) in un ciclo. E se rileviamo un inserimento in uno di essi, saltiamo un passaggio in modo che gli stessi elementi degli array confrontati siano di nuovo vicini.Algoritmo:
Variabili: i - indice della cella dell'array con il contenuto del file OLD. nI - indice della cella dell'array con il contenuto del NUOVO file. Se gli elementi degli array differiscono, li scriviamo in variabili temporanee: oldMismatch - un elemento da un array in pila newMismatch - un elemento da un nuovo array Quando si esegue l'iterazione sugli elementi dell'array, sono possibili i seguenti casi:-
le variabili oldMismatch e newMismatch sono vuote. Gli elementi nei due array sono gli stessi. Scrivi Type.SAME nell'elenco. Andare avanti.
-
le variabili oldMismatch e newMismatch sono vuote. Gli elementi nei due array NON sono gli stessi. Scriviamo il valore da quello vecchio a oldMismatch, da quello nuovo a newMismatch. Andare avanti.
-
le variabili oldMismatch e newMismatch NON sono vuote. Li confrontiamo con gli elementi attuali dell'array.
Traiamo le conclusioni. Scriviamo i risultati in un elenco (linee variabili). Saltiamo il passaggio del ciclo per uno degli array.
-
3.1 oldMismatch è uguale all'elemento corrente dell'array NEW. Ciò significa che è stata aggiunta una riga al file.
Il valore di questa stringa viene archiviato in newMismatch. Scriviamolo così.
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
Poiché nell'array contenente il contenuto del nuovo file è presente un elemento aggiuntivo, è necessario spostare il nuovo elemento dell'array 1 in avanti rispetto a quello vecchio.
Pertanto, il VECCHIO array salta 1 passaggio del ciclo.
io--;
-
3.2 newMismatch è uguale all'elemento corrente dell'array OLD. Ciò significa che una riga è stata rimossa dal file. Scriviamolo.
lines.add(new LineItem(Type.REMOVED, oldMismatch)); lines.add(new LineItem(Type.SAME, newMismatch));
C'è un elemento aggiuntivo nell'array OLD. Ciò significa che il NUOVO array salta 1 passaggio del ciclo.
nI--;
-
-
Elaborazione della fine dell'array. E ora siamo giunti alla fine del vecchio schema. Ci sono diverse situazioni possibili
-
4.1 - ArrayIndexOutOfBoundsException: il nuovo array è più corto di quello vecchio. Registriamo che l'ultima riga del file è stata cancellata.
-
4.2 - Rimane l'ultimo elemento del nuovo array, non coperto dalla nostra attenzione. Lo registriamo come aggiunto.
-
4.3 - Le variabili oldMismatch e newMismatch non sono vuote. Scriviamo:
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
-
GO TO FULL VERSION