JavaRush /Blogue Java /Random-PT /Opção para resolver o problema de nível 19, tarefa 16 (mo...
Anton Stezhkin
Nível 41

Opção para resolver o problema de nível 19, tarefa 16 (monitoramento de mudanças)

Publicado no grupo Random-PT

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

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

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

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

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

  4. Processando o final do array. E agora chegamos ao fim do antigo array. Existem várias situações possíveis

    1. 4.1 - ArrayIndexOutOfBoundsException - o novo array é menor que o antigo. Registramos que a última linha do arquivo foi excluída.

    2. 4.2 - Resta o último elemento do novo array, não coberto pela nossa atenção. Nós o registramos como adicionado.

    3. 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));
PS - não se esqueça de redefinir as variáveis ​​e acompanhar a variável nI.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION