【问题标题】:Comparing two strings or objects and getting the difference back比较两个字符串或对象并取回差异
【发布时间】:2011-01-05 03:08:35
【问题描述】:

我想在我的网站上实现一种版本历史记录,我需要一种比较字符串或对象键的方法。例如:

原始字符串/对象键:更快的棕狐

修改后的字符串/对象键:快速的棕色狐狸 跳过懒惰的兔子

修改:添加跳过懒兔删除er

我只想在我的历史记录表中保存修订。我真的不知道从哪里开始,所以任何如何让我继续前进的想法或有关方法的建议都将非常感激。

我知道find() 函数,我怀疑它是使用的主要候选者,但我不知道如何将其可视化为解决方案,因为它可以比较字符串“批发”。

【问题讨论】:

  • 正如@oragepips 指出的,这不是一个容易的问题。例如,在您的示例中,添加“brown fox jumped ov”、删除“brown fox”和添加“the lazy rabbit”也是正确的(尽管可能不太正确)。查看第 3 方实用程序。

标签: string coldfusion diff coldfusion-9


【解决方案1】:

您想要一个差异算法(我已将问题标记为此类),我强烈建议您不要尝试自己编写。我已经尝试过 - 并且失败了 - 因为这是一个 NP 完全问题并且不容易让你思考。相反,请查看 diff-match-patch,它具有用于客户端 (demo) 或服务器端处理的 JavaScript 和 Java 实现。如果您需要进行 HTML 差异化,请查看 daisydiff,尽管预先警告 HTML/XML 差异化确实是一种痛苦的体验 (see this page for some reasons why)。

可能差异的祖父是GNU diff,它也有一个Java implementation(查找“GNU Diff for Java”)。这个算法比 diff-match-patch (dmp) 更优化,尽管 dmp 似乎一直在改进,所以如果你需要比较非常大的字符串(例如兆字节),GNU 算法可能是一个更好的选择。

【讨论】:

  • orangepips,这是完美的。唯一的问题是它是 java,我不知道如何将它集成到 ColdFusion 应用程序中!如果您有任何教程,请分享。
  • 不,.zip 中有一个 JavaScript 版本以及一个提供示例用法的 .html 文件。我包含的演示链接使用 JavaScript 版本。
  • @Mel,查看你的 CF Web Dev guide,一般来说,将 Java 集成到 CF 应用程序中非常容易
【解决方案2】:

好的,那this 呢?不确定它是否像您想要的那样处理普通的旧字符串,但它似乎解决了您对不知道如何处理 Java 集成位的担忧(因为它已经编写好了)。至少应该指出你的写作方向。

【讨论】:

  • 托德,很高兴知道。我会调查一下。我意识到我不需要存储唯一的差异。我应该只存储整个修改后的字符串并使用 JS 版本的 diff-match-patch 来显示客户端的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2014-02-26
相关资源
最近更新 更多