首页 > 解决方案 > 如何在数组上进行scala模式匹配?

问题描述

我是一个新的 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),递归调用函数,并使用一个新的头部数组和任何作为尾部的数组。否则用下一个的新数组调用函数,并将其作为尾部。但是这段代码给我一个错误:

"error: missing parameter type for expanded function ((<x$1: error>) => x$1.$times) (in solution.scala)
                countErased(Array(h,_*), acc+1)" 

怎么了?

标签: arraysscalafunctional-programmingpattern-matching

解决方案


欢迎来到 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)
        }
    }
  }


推荐阅读