1

如何实现一个diff功能,例如 Stack Overflow 的问题修订历史?

4

5 回答 5

3

您在这里有一个 diff 算法实现的javascript 示例

基于:

P. Heckel,一种隔离文件 Comm 之间差异的技术。ACM, 21, (4), 264--268 (1978)。

该实现本身有两个功能,推荐使用其中之一:

diffString( String oldFile, String newFile )

此方法采用两个字符串并计算每个字符串的差异。最终结果是用 HTML 标记的“newFile”(表示从 oldFile 中删除和向 newFile 添加)。

于 2008-10-25T07:04:09.653 回答
2

我会找到 FreeBSD diff 实用程序的代码并将其用作基线。当许可证允许这种复制时,重新发明轮子是没有意义的。

于 2008-10-25T07:38:40.470 回答
1

大多数算法都基于 LCS: Longest common subsequence。以有效的方式实现它并不明显。您可能会在网上找到各种语言的各种实现。

于 2008-10-25T13:52:19.847 回答
0

我想唯一的方法是比较形成 2 个字符串的每个字符。像这样的东西:


void diff(String first,String second) {
   int biggest = (first.length() > second.length()) ? first.length() : second.length();
   for(int i = 0;i < biggest;i++) {
      //compare each char from the longest string with each char from the shorter
      // do something with them if they're not equal
   }
}

这只是我将如何做的草图。一切都取决于您想对数据做什么。

于 2008-10-25T07:12:53.940 回答
0

如果您想要的是修订历史记录,请不要从 diff 开始重新发明轮子。只需将所有内容都放入版本控制并使用其差异和日志记录工具。对于简单的线性历史,就像RCS一样简单。或者您可以向它扔最新的大炮并使用git

大多数差异实用程序都会进行逐行差异。堆栈溢出会进行逐字比较。为此,需要类似wdiff的东西。大多数版本控制系统都允许您插入 diff 实用程序。开箱即用,git diff --color-words与这里所做的非常接近。稍微摆弄一下设置,你可能会让它吐出一些东西,然后你可以把它做成一个漂亮的网页。

于 2008-10-25T07:49:12.790 回答