怎么在Java中使用Diff-Match-Patch逐行比较两个字符串?

来源:爱站网时间:2021-11-15编辑:网友分享
爱站技术小编最近被问到:怎么在Java中使用Diff-Match-Patch逐行比较两个字符串?这个是没办法用一两句话给说清楚的,只能用一篇文章给大家详解一下。有兴趣的朋友可以来参考参考。

问题描述


我正在寻找一种简单的方法来在Java中逐行对两个String进行Myers Diff。

根据this,Google diff-match-patch library具有此功能。但是,在Java版本中,引用的那些方法受保护和/或受程序包保护!

我找不到另一个库,其中(1)可以做到这一点,而(2)似乎维护得很好。

因此,我最终使用反射来让Google自己来做。我想避免任何人都必须重新实现它,所以我将发布所做的回答。

思路:


这是我想出的代码。随时进行编辑/修复。

我不确定反射的最佳实践(除了“别”之外,但我绝对想知道是否有人有想法。

List diff = new diff_match_patch() {
    // anonymous extension
    List getLineDiff(String a, String b) throws NoSuchFieldException, IllegalAccessException {
        LinesToCharsResult res = this.diff_linesToChars(a, b);

        // extract protected fields
        Class> clazz = res.getClass();
        Field chars1 = clazz.getDeclaredField("chars1");
        Field chars2 = clazz.getDeclaredField("chars2");
        Field lineArray = clazz.getDeclaredField("lineArray");
        chars1.setAccessible(true);
        chars2.setAccessible(true);
        lineArray.setAccessible(true);

        // follow the docs https://github.com/google/diff-match-patch/wiki/Line-or-Word-Diffs
        String chars1Inst = (String) chars1.get(res);
        String chars2Inst = (String) chars2.get(res);
        List lineArrayInst = (List) lineArray.get(res);
        LinkedList diff = this.diff_main(chars1Inst, chars2Inst, false);

        // convert back to original strings
        this.diff_charsToLines(diff, lineArrayInst);

        return diff;
    }
}.getLineDiff(expected, output);

 以上内容就是爱站技术频道小编为大家分享的怎么在Java中使用Diff-Match-Patch逐行比较两个字符串?看完以上分享之后,大家应该都知道怎么操作了吧。

上一篇:需要帮助创建10%随机数组进行排序,要怎么操作

下一篇:怎么用jUnit模拟ModelMapper?

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载