Scala使用模式匹配获取List的第一个和最后一个元素

Tej*_*eni 11 functional-programming scala pattern-matching

我在列表上进行模式匹配.无论如何我可以访问列表的第一个和最后一个元素进行比较吗?

我想做点什么......

case List(x, _*, y) if(x == y) => true
Run Code Online (Sandbox Code Playgroud)

要么

case x :: _* :: y =>

或类似的东西......在哪里x,y是列表的第一个和最后一个元素..

我怎么能这样做..任何想法?

mis*_*tor 24

使用标准:++:scala.collection包中的提取器


原始答案

定义自定义提取器对象.

object :+ {
  def unapply[A](l: List[A]): Option[(List[A], A)] = {
    if(l.isEmpty)
      None
    else 
      Some(l.init, l.last)
  }
}
Run Code Online (Sandbox Code Playgroud)

可以用作:

val first :: (l :+ last) = List(3, 89, 11, 29, 90)
println(first + " " + l + " " + last) // prints 3 List(89, 11, 29) 90
Run Code Online (Sandbox Code Playgroud)

(对于您的情况:case x :: (_ :+ y) if(x == y) => true)

  • 回答我自己的问题 - 似乎在这里得到了解答:http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-pattern-working/1059161#1059161这里有更多细节:http: //www.artima.com/pins1ed/working-with-lists.html#16.5 (2认同)

Deb*_*ski 16

万一你错过了明显的:

case list @ (head :: tail) if head == list.last => true
Run Code Online (Sandbox Code Playgroud)

head::tail部分在那里,所以你不匹配空列表.


Tho*_*ger 9

只是:

case head +: _ :+ last => 
Run Code Online (Sandbox Code Playgroud)

例如:

scala> val items = Seq("ham", "spam", "eggs")
items: Seq[String] = List(ham, spam, eggs)

scala> items match {
     |   case head +: _ :+ last => Some((head, last))
     |   case List(head) => Some((head, head))
     |   case _ => None
     | }
res0: Option[(String, String)] = Some((ham,eggs))
Run Code Online (Sandbox Code Playgroud)