[英]how to do scala pattern matching on array?
我是一个新的 Scala 程序员,我对 Scala 数组模式匹配有疑问:
def countErased(sorted: Array[Array[Int]], acc: Int): Int = {
sorted match{
case Array() | Array(_) => acc
case Array(h,n,_*) =>
if(n(0) < h(1)){
countErased(Array(h,_*), acc+1)
}else{
countErased(Array(n,_*), acc)
}
}
}
基本上我想要做的是:当我们有一个长度大于 2 的数组时,如果 n(0)< h(1),则递归地调用 function,并使用一个新的头部数组和任何作为尾部的数组。 否则调用 function 并使用下一个新数组以及任何作为尾部的新数组。 但是这段代码给我一个错误:
"error: missing parameter type for expanded function ((<x$1: error>) => x$1.$times) (in solution.scala)
countErased(Array(h,_*), acc+1)"
怎么了?
欢迎来到 Scala 社区:)
我同意其他评论,倾向于推荐Seq
和List
,因为它们是不可变的(尤其是在递归设置中更可取)和高效。
虽然它可以使用Array
,但您的代码几乎可以工作,我所要添加的只是为_*
捕获命名(这就是rest@
正在做的事情),然后它是Seq[Array]
的一个实例,我可以在递归调用中重新使用它:
def countErased(sorted: Array[Array[Int]], acc: Int): Int = {
sorted match {
case Array() | Array(_) => acc
case Array(h, n, rest@_*) =>
if (n(0) < h(1)) {
countErased(h +: rest.toArray, acc + 1)
} else {
countErased(n +: rest.toArray, acc)
}
}
}
您的直接问题已在另一个答案中得到解决:您只需为 splat 命名,例如rest@_*
,并使用它来引用它。
我只想支持评论中的建议,并提到您应该使用List
而不是数组(如果方便的话,您可以使用调用countErased(array.toList, 0)
的包装器 function )。
scala 中的match
在列表中看起来也更漂亮和惯用:
def countErased(sorted: List[Array[Int]], acc: Int) = sorted match {
case h@Array(_, x, _*) :: Array(y, _*) :: tail if y < x => countErased(h :: tail, acc+1)
case _ :: n :: tail => countErased(n :: tail, acc)
case _ => acc
}
附带说明一下,与原始实现的一个区别是,如果 arrays 之一恰好具有少于两个元素,则此实现不会抛出。
你其实很接近。 您只需要记住sorted
变量仍然可供您使用,并且它包含构建下一个Array
所需的内容。
def countErased(sorted: Array[Array[Int]], acc: Int): Int =
sorted match {
case Array() | Array(_) => acc
case Array(h, n, _*) =>
if (n(0) < h(1)) countErased(h +: sorted.drop(2), acc+1)
else countErased( sorted.tail, acc)
}
如前所述,以这种方式操作 arrays 效率非常低,但如果你被Array[Array[Int]]
卡住,这将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.