繁体   English   中英

如何在数组上进行 scala 模式匹配?

[英]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 社区:)

我同意其他评论,倾向于推荐SeqList ,因为它们是不可变的(尤其是在递归设置中更可取)和高效。

虽然它可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM