JavaRush /Java 博客 /Random-ZH /解决问题级别 19 任务 16 的选项(监控变化)
Anton Stezhkin
第 41 级

解决问题级别 19 任务 16 的选项(监控变化)

已在 Random-ZH 群组中发布

背景:

这个问题我解决了很长时间。其中有必要比较文件的两个版本并查找更改。我决定以数组的形式提取文件的内容并比较数组。然后我傻了很长一段时间,犯了错误,最后我在盒子里的一张纸上画了数组。实际上,在此之前我查看了另一种解决方案。但它太复杂了,我无法掌握:)此外,还有两种不同的算法,以防旧文件较长和新文件较长。我不喜欢它。

我的解决方案的要点:

有2个相同的数组。在整篇文章中,我将它们称为“新数组”和“旧数组”。并且可以将新元素插入到每个元素中。那些。参考数组被认为是与所有删除的旧文件的内容相对应的数组。新旧文件的内容被视为插入的参考。我们循环遍历两个数组(旧数组和新数组的内容)。如果我们检测到其中之一存在插入,那么我们会跳过一步,以便比较数组的相同元素再次位于附近。

算法:

变量: i - 包含 OLD 文件内容的数组单元的索引。nI - 包含新文件内容的数组单元的索引。如果数组的元素不同,我们将它们写入临时变量: oldMismatch - 堆栈数组中的元素 newMismatch - 新数组中的元素 迭代数组元素时,可能出现以下情况:
  1. oldMismatch 和 newMismatch 变量为空。两个数组中的元素相同。将 Type.SAME 写入列表。前进。

  2. oldMismatch 和 newMismatch 变量为空。两个数组中的元素不相同。我们将旧值写入oldMismatch,将新值写入newMismatch。前进。

  3. 变量 oldMismatch 和 newMismatch 不为空。我们将它们与数组的当前元素进行比较。

    让我们得出结论。我们将结果写入列表(行变量)。我们跳过其中一个数组的循环步骤。

    1. 3.1 oldMismatch 等于NEW 数组的当前元素。这意味着文件中添加了一行。

      该字符串的值存储在 newMismatch 中。我们就这样写下来吧。

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

      由于数组中有一个附加元素包含新文件的内容,因此需要将新数组元素相对于旧数组向前移动 1 个元素。

      因此,OLD 数组会跳过 1 个循环步骤。

      我 - ;

    2. 3.2 newMismatch 等于OLD 数组的当前元素。这意味着一行已从文件中删除。让我们把它写下来。

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

      OLD 数组中有一个附加元素。这意味着 NEW 数组跳过 1 个循环步骤。

      你 - ;

  4. 处理数组的末尾。现在我们已经到了旧数组的末尾。有几种可能的情况

    1. 4.1 - ArrayIndexOutOfBoundsException - 新数组比旧数组短。我们记录文件的最后一行被删除。

    2. 4.2 - 新数组的最后一个元素仍然存在,没有被我们的注意力覆盖。我们将其记录为添加的。

    3. 4.3 - 变量 oldMismatch 和 newMismatch 不为空。我们写下:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS - 不要忘记重置变量并跟踪 nI 变量。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION