簡體   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