【问题标题】:How to realize a diff function?如何实现一个diff功能?
【发布时间】:2018-09-18 19:06:53
【问题描述】:

如何实现diff 函数,例如 Stack Overflow 的问题修订历史记录?

【问题讨论】:

  • 我认为您需要提供更多信息...

标签: linux diff


【解决方案1】:

这里有一个javascript example 的差异算法实现。

基于:

P. Heckel, A technique for isolating differences between files 通讯。 ACM, 21, (4), 264--268 (1978)。

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

diffString( String oldFile, String newFile )

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这将是一个选项,但在这种特殊情况下(差异代码库),从头开始编写它会容易十倍。 diff 代码库是......拜占庭式的,至少可以这么说。它的古老程度足以让你在看了不到 10 分钟后尖叫起来。我知道,我看过:)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-28
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-07
          • 1970-01-01
          • 2022-07-04
          相关资源
          最近更新 更多