我对Scala和整个函数式编程风格都很陌生。我需要做的是通过比较两个单词的每个字母来计算两个字符串之间的相似性。该函数将与相同长度的单词一起使用。
例如“网络”和“锻炼”的相似度为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)更优雅呢?
答案 0 :(得分:10)
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}