Scala列表匹配最后一个元素

bas*_*h0r 4 scala pattern-matching

我正在学习Scala,我很惊讶.这种语言非常优雅地处理了很多问题.但是,在匹配列表的最后一个元素时遇到了问题.

我们来看看这段代码:

def stringify(list: List[String]): String = list match {
  case x :: xs => x + (if (xs.length != 0) ":" else "") + stringify(xs)
  case Nil => ""
}
Run Code Online (Sandbox Code Playgroud)

这是非常不优雅的,我想更直观地写它,像这样:

def stringify(list: List[String]): String = list match {
  case x :: xs => x + ":" + stringify(xs)
  case x :: Nil => x
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

提前致谢!

Mic*_*jac 5

您需要切换订单.该xs标志将急切地匹配该位置的任何.尝试匹配Nil将使该语句不再无法访问.此外,您仍需要Nil自行匹配以计算空列表.

def stringify(list: List[String]): String = list match {
   case x :: Nil => x
   case x :: xs => x + ":" + stringify(xs)  
   case Nil => ""
}
Run Code Online (Sandbox Code Playgroud)

虽然mkString已经做了你想做的事情.

  • 这是一个很好的答案.请注意操作,小心递归.如果您可以将您的方法作为尾递归来实现,那么这将允许编译器通过重用堆栈来优化实现,以便它可以扩展为更大的数据集.http://oldfashionedsoftware.com/2008/09/27/tail-recursion-basics-in-scala/ (2认同)