【问题标题】:How many percentage one String is part of other String?一个字符串是另一个字符串的一部分的百分比是多少?
【发布时间】:2014-03-28 08:26:51
【问题描述】:
String a = 'string'
String b = 'This is a strin'
println b.containsSimilarity(a)

Groovy 中是否有类似 imaginary containsSimilarity 的函数来表示字符串的差异,所以 我想在 "string" 中搜索 "This is a strin" 和经过比较说 83% 的 String "string" 是在 "This is a strin" 中找到的。 使用 Spock 时的断言之类的东西

断言 "string"=="string"

结果是:

"字符串"=="字符串" | 错误的 1 个差异(83% 相似性) 细绳) 字符串(-)

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

【问题讨论】:

标签: string groovy compare spock


【解决方案1】:
​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
​

【讨论】:

  • 谢谢你的回答,但是如果我们有 s1="very nice string", s2="This is very string" 结果将是 31%,但实际上有 10 个相同来自 16 的信件 - 大约 63%。因为你的算法从后面切入。如果我们在某些不相等的问题之间有相等的部分,则只得到 'very' 5 个字母。
【解决方案2】:

我挖掘了一些 Spock 代码,使用“相似性”作为关键字,很快就找到了 EditDistance 类。 Spock 中用于字符串距离计算的那个类。它只取决于 EditPathOperation,方便提取。
如果您想要漂亮的印刷版,请查看EditPathRenderer。它依赖于 TextUtil.escape 方法,但它也是可提取的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多