[英]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.