我发现自己写了一段看起来像这样的代码:
def language(frequencies: Array[String], text: Array[String]) = {
val allText = text.mkString.replace(" ", "")
val emaps = for {
fset <- frequencies
devs = for {
i <- 'a' to 'z'
p = fset.indexOf(i) match {
case -1 => 0d
case x => fset.substring(x + 1, x + 3).toDouble / 100 * allText.size
}
a = allText.count(i ==)
dev = math.pow(p - a, 2)
} yield dev
} yield devs.sum
emaps.min
}
如您所见,值emaps
是一个由字符串数组创建的双打数组。它工作正常。我之前没有看到像这样嵌套的for-comprehension。是的还是我应该以某种方式进行重构?
答案 0 :(得分:7)
使用map
和朋友通常比在for构造的循环部分中编写长代码块更标准。由于allText不依赖于频率,因此您可以在开始时执行此操作:
val lcounts = 'a' to 'z' map {i => i -> allText.count(i==)} toMap
val emaps = frequencies.map { fset =>
val devs = 'a' to 'z' map { i =>
val p = fset.indexOf(i) match {
case -1 => 0d
case x => fset.substring(x+1, x+3).toDouble / 100 * allText.size
}
math.pow(p - lcounts(i), 2)
}
devs.sum
}
(另外,你确定要平方负值,即allText.count(i ==)非零,但fset.indexOf(i)是-1?这看起来很奇怪。)
答案 1 :(得分:0)
只要我使用匹配语句或其他简单的东西,就可以继续if / else我会在那里使用一种方法。通过良好的命名,代码将更清晰地阅读IMO。