gpt4 book ai didi

scala - 避免 Scala 中的循环

转载 作者:行者123 更新时间:2023-12-04 17:22:07 25 4
gpt4 key购买 nike

我对 Scala 和整个函数式编程风格很陌生。我需要做的是通过比较两个单词的每个字母来计算两个字符串之间的相似度。该函数将用于相同长度的单词。

例如,“network”和“workout”的相似度为 1。“House”和“Mouse”的相似度为 4。

这是我将如何以一种非常老式的 C# 方式做到这一点:

int calculateCharSimilarity(string first, string second)
{
int similarity = 0;
for(int i = 0; i < first.lenght() && i < first.lenght(); i++)
{
if(first.charAt(i) == second.charAt(i))
similarity++;
}
return similarity;
}

到目前为止,我在 Scala 中所做的是编写一个尾递归函数以避免循环:

@tailrec
private def calculateCharSimilarity(first: Seq[Char], second: Seq[Char], similarity: Int = 0): Int = {
if(first != Nil && second != Nil)
calculateCharSimilarity(first.tail, second.tail, if(first.head == second.head) similarity + 1 else similarity)
else
similarity
}

但我不太确定这是否是 Scala 中的最佳实践。例如,没有任何方法可以使用 Collection Combinators (zip, filter) 做得更优雅吗?

最佳答案

def charSimilarity(first: String, second: String) =
(first.view zip second).count{case (a, b) => a == b}

charSimilarity("network", "workout")
// Int = 1

charSimilarity("House", "Mouse")
// Int = 4

您可以删除方法 view这里。在这种情况下,您将创建一个新的元组集合 (Char, Char)尺寸 min(first.size, second.size) .对于小字符串(单个单词),您不会遇到性能问题。

替代实现:
(first, second).zipped.count{case (a, b) => a == b}

关于scala - 避免 Scala 中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com