JavaRush /Blog Java /Random-ES /Opción para resolver el problema nivel 19 tarea 16 (monit...
Anton Stezhkin
Nivel 41

Opción para resolver el problema nivel 19 tarea 16 (monitoreo de cambios)

Publicado en el grupo Random-ES

Fondo:

Resolví este problema durante mucho tiempo . En él fue necesario comparar 2 versiones del archivo y encontrar cambios. Decidí extraer el contenido de los archivos en forma de matrices y compararlas. Luego fui estúpido durante mucho tiempo y cometí errores y al final dibujé matrices en una hoja de papel dentro de una caja. En realidad, antes de esto busqué otra solución. Pero es tan complicado que no pude dominarlo :) Además, había 2 algoritmos diferentes en caso de que el archivo antiguo sea más largo y si el archivo nuevo es más largo. No me gusta.

La esencia de mi solución:

Hay 2 matrices idénticas. A lo largo del texto los llamaré “matriz nueva” y “matriz antigua”. Y en cada uno de ellos se pueden insertar nuevos elementos. Aquellos. Se considera que la matriz de referencia es la correspondiente al contenido del archivo antiguo con todas las eliminaciones. El contenido del archivo antiguo y nuevo se trata como una referencia con inserciones. Recorremos ambas matrices (el contenido de la antigua y la nueva) en un bucle. Y si detectamos una inserción en uno de ellos, entonces nos saltamos un paso para que los mismos elementos de los arrays comparados vuelvan a estar cerca.

Algoritmo:

Variables: i - índice de la celda del arreglo con el contenido del archivo ANTIGUO. nI: índice de la celda de la matriz con el contenido del archivo NUEVO. Si los elementos de las matrices difieren, los escribimos en variables temporales: oldMismatch - un elemento de una matriz apilada newMismatch - un elemento de una nueva matriz Al iterar sobre elementos de una matriz, son posibles los siguientes casos:
  1. las variables oldMismatch y newMismatch están vacías. Los elementos de las dos matrices son iguales. Escriba Type.SAME en la lista. Adelante.

  2. las variables oldMismatch y newMismatch están vacías. Los elementos de las dos matrices NO son iguales. Escribimos el valor del antiguo a oldMismatch, del nuevo a newMismatch. Adelante.

  3. las variables oldMismatch y newMismatch NO están vacías. Los comparamos con los elementos actuales de la matriz.

    Saquemos conclusiones. Escribimos los hallazgos en una lista (líneas variables). Nos saltamos el paso del bucle para una de las matrices.

    1. 3.1 oldMismatch es igual al elemento actual de la NUEVA matriz. Esto significa que se agregó una línea al archivo.

      El valor de esta cadena se almacena en newMismatch. Escribámoslo así.

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));

      Dado que hay un elemento adicional en la matriz que contiene el contenido del nuevo archivo, debe desplazar el nuevo elemento de la matriz 1 hacia adelante en relación con el anterior.

      Por lo tanto, la matriz ANTIGUA se salta 1 paso del bucle.

      i--;

    2. 3.2 newMismatch es igual al elemento actual de la matriz ANTIGUA. Esto significa que se ha eliminado una línea del archivo. Anotémoslo.

      lines.add(new LineItem(Type.REMOVED, oldMismatch));
       lines.add(new LineItem(Type.SAME, newMismatch));

      Hay un elemento adicional en la matriz OLD. Esto significa que la NUEVA matriz se salta 1 paso del ciclo.

      nI--;

  4. Procesando el final de la matriz. Y ahora hemos llegado al final del antiguo conjunto. Hay varias situaciones posibles.

    1. 4.1 - ArrayIndexOutOfBoundsException - la nueva matriz es más corta que la anterior. Registramos que se eliminó la última línea del archivo.

    2. 4.2 - El último elemento de la nueva matriz permanece, no cubierto por nuestra atención. Lo registramos como añadido.

    3. 4.3 - Las variables oldMismatch y newMismatch no están vacías. Anotamos:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PD: no olvide restablecer las variables y realizar un seguimiento de la variable nI.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION