背景:
这个问题我解决了很长时间。其中有必要比较文件的两个版本并查找更改。我决定以数组的形式提取文件的内容并比较数组。然后我傻了很长一段时间,犯了错误,最后我在盒子里的一张纸上画了数组。实际上,在此之前我查看了另一种解决方案。但它太复杂了,我无法掌握:)此外,还有两种不同的算法,以防旧文件较长和新文件较长。我不喜欢它。我的解决方案的要点:
有2个相同的数组。在整篇文章中,我将它们称为“新数组”和“旧数组”。并且可以将新元素插入到每个元素中。那些。参考数组被认为是与所有删除的旧文件的内容相对应的数组。新旧文件的内容被视为插入的参考。我们循环遍历两个数组(旧数组和新数组的内容)。如果我们检测到其中之一存在插入,那么我们会跳过一步,以便比较数组的相同元素再次位于附近。算法:
变量: i - 包含 OLD 文件内容的数组单元的索引。nI - 包含新文件内容的数组单元的索引。如果数组的元素不同,我们将它们写入临时变量: oldMismatch - 堆栈数组中的元素 newMismatch - 新数组中的元素 迭代数组元素时,可能出现以下情况:-
oldMismatch 和 newMismatch 变量为空。两个数组中的元素相同。将 Type.SAME 写入列表。前进。
-
oldMismatch 和 newMismatch 变量为空。两个数组中的元素不相同。我们将旧值写入oldMismatch,将新值写入newMismatch。前进。
-
变量 oldMismatch 和 newMismatch 不为空。我们将它们与数组的当前元素进行比较。
让我们得出结论。我们将结果写入列表(行变量)。我们跳过其中一个数组的循环步骤。
-
3.1 oldMismatch 等于NEW 数组的当前元素。这意味着文件中添加了一行。
该字符串的值存储在 newMismatch 中。我们就这样写下来吧。
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
由于数组中有一个附加元素包含新文件的内容,因此需要将新数组元素相对于旧数组向前移动 1 个元素。
因此,OLD 数组会跳过 1 个循环步骤。
我 - ;
-
3.2 newMismatch 等于OLD 数组的当前元素。这意味着一行已从文件中删除。让我们把它写下来。
lines.add(new LineItem(Type.REMOVED, oldMismatch)); lines.add(new LineItem(Type.SAME, newMismatch));
OLD 数组中有一个附加元素。这意味着 NEW 数组跳过 1 个循环步骤。
你 - ;
-
-
处理数组的末尾。现在我们已经到了旧数组的末尾。有几种可能的情况
-
4.1 - ArrayIndexOutOfBoundsException - 新数组比旧数组短。我们记录文件的最后一行被删除。
-
4.2 - 新数组的最后一个元素仍然存在,没有被我们的注意力覆盖。我们将其记录为添加的。
-
4.3 - 变量 oldMismatch 和 newMismatch 不为空。我们写下:
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
-
GO TO FULL VERSION