怎么在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逐行比较两个字符串?看完以上分享之后,大家应该都知道怎么操作了吧。