在Scala中嵌入for-understanding是一种很好的风格吗?
发布时间:2020-12-16 09:05:24 所属栏目:安全 来源:网络整理
导读:我刚刚发现自己编写了一段代码如下: 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 { ca
|
我刚刚发现自己编写了一段代码如下:
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.它可以,还是应该以某种方式重构? 解决方法
使用map和friends通常比在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?这看起来很奇怪.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
