Scala列表匹配最后一个元素

时间:2014-11-23 23:34:46

标签: 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 => ""
}

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

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

我该怎么做?

提前致谢!

2 个答案:

答案 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