字符串比较找出不同字符串打印

 

让我们考虑以下要求:我们想找出字符串“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显然更具性能,尽管它只返回两个字符串开始不同的子字符串。

 

posted @ 2020-12-03 09:08  飘若逸  阅读(664)  评论(0)    收藏  举报