JavaRush /Blog Java /Random-FR /Option de résolution du problème niveau 19 tâche 16 (suiv...
Anton Stezhkin
Niveau 41

Option de résolution du problème niveau 19 tâche 16 (suivi des changements)

Publié dans le groupe Random-FR

Arrière-plan:

J'ai résolu ce problème depuis très longtemps . Il fallait comparer 2 versions du fichier et trouver des modifications. J'ai décidé d'extraire le contenu des fichiers sous forme de tableaux et de comparer les tableaux. Ensuite, j'ai été stupide pendant longtemps et j'ai fait des erreurs et à la fin j'ai dessiné des tableaux sur un morceau de papier dans une boîte. En fait, avant cela, j'ai envisagé une autre solution. Mais c'est tellement compliqué que je n'arrivais pas à le maîtriser :) De plus, il y avait 2 algorithmes différents au cas où l'ancien fichier serait plus long et si le nouveau fichier serait plus long. Je n'ai pas aimé ça.

L'essentiel de ma solution :

Il existe 2 tableaux identiques. Tout au long du texte, je les appellerai « nouveau tableau » et « ancien tableau ». Et de nouveaux éléments peuvent être insérés dans chacun d’eux. Ceux. Le tableau de référence est considéré comme celui correspondant au contenu de l'ancien fichier avec toutes les suppressions. Le contenu de l'ancien et du nouveau fichier est traité comme une référence avec des insertions. Nous parcourons les deux tableaux (le contenu de l'ancien et du nouveau) en boucle. Et si nous détectons une insertion dans l’un d’eux, alors nous sautons une étape pour que les mêmes éléments des tableaux comparés soient à nouveau proches.

Algorithme:

Variables : i - index de la cellule du tableau avec le contenu de l'ANCIEN fichier. nI - index de la cellule du tableau avec le contenu du NOUVEAU fichier. Si les éléments des tableaux diffèrent, nous les écrivons dans des variables temporaires : oldMismatch - un élément d'un tableau empilé newMismatch - un élément d'un nouveau tableau Lors d'une itération sur les éléments du tableau, les cas suivants sont possibles :
  1. les variables oldMismatch et newMismatch sont vides. Les éléments des deux tableaux sont les mêmes. Écrivez Type.SAME dans la liste. Poursuivre.

  2. les variables oldMismatch et newMismatch sont vides. Les éléments des deux tableaux ne sont PAS les mêmes. Nous écrivons la valeur de l'ancienne dans oldMismatch, de la nouvelle dans newMismatch. Poursuivre.

  3. les variables oldMismatch et newMismatch ne sont PAS vides. Nous les comparons avec les éléments actuels du tableau.

    Tirons des conclusions. Nous écrivons les résultats dans une liste (lignes variables). Nous sautons l'étape de boucle pour l'un des tableaux.

    1. 3.1 oldMismatch est égal à l'élément actuel du NEW tableau. Cela signifie qu'une ligne a été ajoutée au fichier.

      La valeur de cette chaîne est stockée dans newMismatch. Écrivons-le comme ça.

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

      Puisqu'il y a un élément supplémentaire dans le tableau contenant le contenu du nouveau fichier, vous devez décaler le nouvel élément du tableau 1 vers l'avant par rapport à l'ancien.

      Par conséquent, l’ANCIEN tableau saute 1 étape de boucle.

      je--;

    2. 3.2 newMismatch est égal à l'élément actuel du tableau OLD. Cela signifie qu'une ligne a été supprimée du fichier. Écrivons-le.

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

      Il y a un élément supplémentaire dans le tableau OLD. Cela signifie que le NOUVEAU tableau saute 1 étape de boucle.

      nI-- ;

  4. Traitement de la fin du tableau. Et maintenant nous sommes arrivés à la fin de l’ancienne série. Il existe plusieurs situations possibles

    1. 4.1 - ArrayIndexOutOfBoundsException - le nouveau tableau est plus court que l'ancien. Nous enregistrons que la dernière ligne du fichier a été supprimée.

    2. 4.2 - Le dernier élément du nouveau tableau demeure, non couvert par notre attention. Nous l'enregistrons comme ajouté.

    3. 4.3 - Les variables oldMismatch et newMismatch ne sont pas vides. Nous écrivons :

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS - n'oubliez pas de réinitialiser les variables et de garder une trace de la variable nI.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION