一个String有多少百分比是其他String的一部分?

时间:2014-03-28 08:26:51

标签: string groovy compare spock

String a = 'string'
String b = 'This is a strin'
println b.containsSimilarity(a)

在Groovy中是否有类似虚构 containsSimilarity 的函数,可以说字符串的差异,所以 我想在中搜索“string” “这是一个strin”,经过比较后说 83%的字符串“string”在“这是一个strin”中找到。 类似于使用Spock时的断言

  

断言“string”==“string”

结果是:

  

“的字符串” == “〜应变”           |           假           1差异(相似度83%)           串)           〜应变( - )

我如何在Groovy中执行此操作?所以不要比较两个字符串,而是要找到 String a 的大部分包含在字符串 b 中。如果a是b - > true的一部分,则为false和打印相似度百分比,并显示差异在哪里。

2 个答案:

答案 0 :(得分:0)

​def s1 = "string", s2 = "This is a strin"
def i = 0, j = 0, l1 = s1.size(), l2 = s2.size()

if (l1 >= l2) {
    large = s1
    small = s2
} else {
    large = s2
    small = s1
}

def percent = 100 / small.size()

def match(large, str) {
    if (large.indexOf(str) == -1) {
        return match(large, str.substring(0, str.size() - 1))
    }
    return str.size()
}

println(Math.round(match(large, small) * percent))  //83
​

答案 1 :(得分:0)

我挖掘了一些Spock代码,使用'similarity'作为关键字,很快就找到了EditDistance类。 Spock用于字符串距离计算的那个类。它只取决于 EditPathOperation,因此可以轻松提取 如果你想要漂亮的印刷版,请看EditPathRenderer。它取决于TextUtil.escape方法,但也可以提取。

但请注意,正如Peter Niederwieser记录的那样,这些课程计算Levenshtein距离,你注意到,这并不是你所需要的。作者也是如此,所以也许他可以为我的回答添加一些有价值的东西。