我正在学习Scala,我很惊讶。这种语言非常优雅地处理了很多问题。但是,在匹配列表的最后一个元素时遇到了问题。
我们来看看这段代码:
def stringify(list: List[String]): String = list match {
case x :: xs => x + (if (xs.length != 0) ":" else "") + stringify(xs)
case Nil => ""
}
这是非常不优雅的,我想更直观地写它,像这样:
def stringify(list: List[String]): String = list match {
case x :: xs => x + ":" + stringify(xs)
case x :: Nil => x
}
我该怎么做?
提前致谢!
答案 0 :(得分:5)
您需要切换订单。 xs
符号将热切地匹配该位置中的任何内容。首先尝试匹配Nil
将使该语句不再无法访问。此外,您仍然需要自己匹配Nil
来计算空列表。
def stringify(list: List[String]): String = list match {
case x :: Nil => x
case x :: xs => x + ":" + stringify(xs)
case Nil => ""
}
虽然mkString
已经做了你想做的事。
答案 1 :(得分:1)
以下是使用List#foldRight
的实现:
def stringify(list: List[String]): String =
list.foldRight(""){
(e, acc) => if (acc.isEmpty) e
else { e + ":" + acc }
}
折叠此列表时,我们需要检查累加器何时为空。否则,我们会在:
字符串结果的末尾获得额外的stringfied
。
<强>测试强>
scala> stringify(List("1", "2" , "3") )
res6: String = 1:2:3
scala> stringify(List("1", "2" , "3", "500") )
res7: String = 1:2:3:500