我正在尝试使用 Scala解决 Codility 的GenomicRangeQuery,为此我编写了以下函数:
def solution(s: String, p: Array[Int], q: Array[Int]): Array[Int] = {
for (i <- p.indices) yield {
val gen = s.substring(p(i), q(i) + 1)
if (gen.contains('A')) 1
else if (gen.contains('C')) 2
else if (gen.contains('G')) 3
else if (gen.contains('T')) 4
}
}
Run Code Online (Sandbox Code Playgroud)
我没有做过很多测试,但它似乎解决了问题。
我的问题是 for comprehension 返回 an scala.collection.immutable.IndexedSeq[AnyVal],而函数必须返回 an Array[Int],因此它抛出 a type mismatch error。
有什么方法可以让 for comprehension 返回一个 Array[Int] 或将 theIndexedSeq[AnyVal]转换为一个Array[Int]?
小智 4
sheunis 上面的回答大部分涵盖了它。
您可以通过调用将 an 强制转换IndexedSeq为 an ,因此第一部分非常简单。对于第二部分,因为存在一个可能的逻辑分支,您可以在其中删除所有案例,所以您可以返回和类型,其最近的共同祖先是。ArraytoArrayif... else...yieldIntUnitAnyVal
请注意,如果您将您替换if... else...为模式匹配,那么您将明确收到编译器警告,因为您没有捕获所有可能的case.
gen match {
case _ if gen.contains("A") => 1
case _ if gen.contains("C") => 2
...
// Throws warning unless you include a `case _ =>` with no `if` clause
}