Fundo:
Eu resolvi esse problema por muito tempo . Nele foi necessário comparar 2 versões do arquivo e encontrar alterações. Decidi extrair o conteúdo dos arquivos na forma de arrays e comparar os arrays. Aí fui burro por muito tempo e cometi erros e no final desenhei matrizes em um pedaço de papel dentro de uma caixa. Na verdade, antes disso procurei outra solução. Mas é tão complicado que não consegui dominá-lo :) Além disso, havia 2 algoritmos diferentes caso o arquivo antigo fosse mais longo e se o novo arquivo fosse mais longo. Eu não gostei disso.A essência da minha solução:
Existem 2 matrizes idênticas. Ao longo do texto irei chamá-los de “novo array” e “antigo array”. E novos elementos podem ser inseridos em cada um deles. Aqueles. A matriz de referência é considerada aquela correspondente ao conteúdo do arquivo antigo com todas as exclusões. O conteúdo do arquivo antigo e do novo é tratado como referência com inserções. Percorremos os dois arrays (o conteúdo do antigo e do novo) em um loop. E se detectarmos uma inserção em um deles, pulamos uma etapa para que os mesmos elementos das matrizes comparadas fiquem novamente próximos.Algoritmo:
Variáveis: i - índice da célula do array com o conteúdo do arquivo OLD. nI - índice da célula do array com o conteúdo do arquivo NEW. Se os elementos dos arrays forem diferentes, nós os escrevemos em variáveis temporárias: oldMismatch - um elemento de um array empilhado newMismatch - um elemento de um novo array Ao iterar sobre os elementos do array, os seguintes casos são possíveis:-
as variáveis oldMismatch e newMismatch estão vazias. Os elementos nas duas matrizes são iguais. Escreva Type.SAME na lista. Vá em frente.
-
as variáveis oldMismatch e newMismatch estão vazias. Os elementos nas duas matrizes NÃO são iguais. Escrevemos o valor do antigo para oldMismatch, do novo para newMismatch. Vá em frente.
-
as variáveis oldMismatch e newMismatch NÃO estão vazias. Nós os comparamos com os elementos atuais do array.
Vamos tirar conclusões. Escrevemos as descobertas em uma lista (variável de linhas). Pulamos a etapa do loop para um dos arrays.
-
3.1 oldMismatch é igual ao elemento atual do array NEW. Isso significa que uma linha foi adicionada ao arquivo.
O valor desta string é armazenado em newMismatch. Vamos escrever assim.
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
Como há um elemento adicional no array contendo o conteúdo do novo arquivo, você precisa mover o novo elemento do array 1 para frente em relação ao antigo.
Portanto, a matriz OLD pula 1 etapa do loop.
eu--;
-
3.2 newMismatch é igual ao elemento atual do array OLD. Isso significa que uma linha foi removida do arquivo. Vamos anotar.
lines.add(new LineItem(Type.REMOVED, oldMismatch)); lines.add(new LineItem(Type.SAME, newMismatch));
Existe um elemento adicional na matriz OLD. Isso significa que o array NEW pula 1 etapa do loop.
não--;
-
-
Processando o final do array. E agora chegamos ao fim do antigo array. Existem várias situações possíveis
-
4.1 - ArrayIndexOutOfBoundsException - o novo array é menor que o antigo. Registramos que a última linha do arquivo foi excluída.
-
4.2 - Resta o último elemento do novo array, não coberto pela nossa atenção. Nós o registramos como adicionado.
-
4.3 - As variáveis oldMismatch e newMismatch não estão vazias. Nós anotamos:
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
-
GO TO FULL VERSION