arrays - 如何在数组上进行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)"
怎么了?
解决方案
欢迎来到 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)
}
}
}
推荐阅读
- python - pyarrow:非传统文件系统无法连接,即使传统可以
- java - 根据坐标打印星形图案
- javascript - _onLocationFound 在 leaflet.locationcontrol 中不起作用
- r - R:如何使用一个列表的元素来重命名另一个不同长度的列表的元素?
- c++ - 创建类变量实例而不初始化它:未知的覆盖说明符
- php - 使用 Guzzlehttp 发送带有 JSON 正文的 POST 请求
- python - 如何使用 reduce() 计算合并值?
- excel - 计算列中单元格中每个数字的值
- postman - 无法将简单的肥皂体与 Postman 中的“x-mock-match-request-body”匹配
- javascript - 如何在 Vue Js 上只允许数字和字母?