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:
  1. le variabili oldMismatch e newMismatch sono vuote. Gli elementi nei due array sono gli stessi. Scrivi Type.SAME nell'elenco. Andare avanti.

  2. 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.

  3. 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.

    1. 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--;

    2. 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--;

  4. Elaborazione della fine dell'array. E ora siamo giunti alla fine del vecchio schema. Ci sono diverse situazioni possibili

    1. 4.1 - ArrayIndexOutOfBoundsException: il nuovo array è più corto di quello vecchio. Registriamo che l'ultima riga del file è stata cancellata.

    2. 4.2 - Rimane l'ultimo elemento del nuovo array, non coperto dalla nostra attenzione. Lo registriamo come aggiunto.

    3. 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));
PS: non dimenticare di reimpostare le variabili e tenere traccia della variabile nI.