Scala 将 IndexedSeq[AnyVal] 转换为 Array[Int]

Mic*_*cho 5 arrays scala

我正在尝试使用 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 }