我正在尝试解决 Codility 的 GenomicRangeQuery使用 Scala,为此我编写了以下函数:
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
}
}
我没有做过很多测试,但它似乎解决了问题。
我的问题是 for 理解返回一个 scala.collection.immutable.IndexedSeq[AnyVal]
,而该函数必须返回一个 Array[Int]
,因此它会抛出类型不匹配错误
。
有没有办法让 for 理解返回 Array[Int] 或将 IndexedSeq[AnyVal]
转换为 Array[Int]
?
最佳答案
上面sheunis的回答大部分涵盖了它。
您可以通过调用 toArray
将 IndexedSeq
强制转换为 Array
,因此第一位非常简单。对于第二部分,因为存在一个可能的逻辑分支,您可以在其中删除所有 if...else...
情况,因此您的 yield
可能会返回两者Int
和 Unit
类型,其最接近的共同祖先是 AnyVal
。
请注意,如果您将 if... else...
替换为模式匹配,那么您将显式收到编译器警告,因为您没有捕获所有可能的情况
.
生成匹配{
case _ if gen.contains("A") => 1
case _ if gen.contains("C") => 2
...
//抛出警告,除非你包含一个没有 `if` 子句的 `case _ =>`
}
关于arrays - Scala 将 IndexedSeq[AnyVal] 转换为 Array[Int],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44064795/