让我们考虑以下要求:我们想找出字符串“ABCDELMN”和“ABCFGLMN”之间的区别。
根据需要输出的格式,忽略编写自定义代码的可能性,我们发现有两个主要选项可用。
第一个是Google编写的diff match patch库。正如他们所说,这个库提供了同步纯文本的健壮算法。
另一个选项是Apache Commons Lang中的StringUtils类。
让我们来探讨一下这两者之间的区别。
差异匹配补丁
在本文中,我们将使用原始Google库的一个分支,因为原始库的工件没有在Maven Central上发布。另外,一些类名与原始代码库不同,并且更符合Java标准。
首先,我们需要在pom.xml文件中包含它的依赖项:
让我们考虑一下如下代码:
如果我们运行上述代码(产生text1和text2之间的差异),打印变量diff将产生以下输出:
实际上,输出将是Diff对象的列表,每个对象都由操作类型(INSERT、DELETE或EQUAL)和与操作相关联的文本部分组成。
当运行text2和text1之间的差异时,我们将得到以下结果:
四。StirngUtils
Apache Commons中的类有一个更简单的方法。
首先,我们将把Apache Commons Lang依赖项添加到pom.xml文件中:
然后,为了找出两个Apache Commons文本之间的区别,我们将调用StringUtils#difference:
生成的输出将是一个简单的字符串:
FGLMN
而运行text2和text1之间的差异将返回:
DELMN
使用StringUtils.indexOfDifference()可以增强这个简单的方法,它将返回两个字符串开始不同的索引(在我们的例子中,是字符串的第四个字符)。此索引可用于获取原始字符串的子字符串,以显示两个输入之间的共同点以及不同点。
五。表现
对于我们的基准测试,我们生成一个10000个字符串的列表,其中固定部分为10个字符,后面是20个随机字母字符。
然后循环遍历列表并在列表的第n个元素和第n+1个元素之间执行diff:
最后,让我们运行基准测试并比较两个库:
六。结论
就纯执行速度而言,StringUtils显然更具性能,尽管它只返回两个字符串开始不同的子字符串。
原文:https://www.cnblogs.com/ybniu/p/14077657.html