我正在做一個列表中的模式匹配。無論如何,我可以訪問列表的第一個和最後一個元素進行比較?Scala使用模式匹配獲取列表的第一個和最後一個元素
我想要做這樣的事情..
case List(x, _*, y) if(x == y) => true
或
case x :: _* :: y =>
或類似的東西... 其中x
和y
是列表的第一個和最後一個元素..
我該怎麼做..任何想法?
我正在做一個列表中的模式匹配。無論如何,我可以訪問列表的第一個和最後一個元素進行比較?Scala使用模式匹配獲取列表的第一個和最後一個元素
我想要做這樣的事情..
case List(x, _*, y) if(x == y) => true
或
case x :: _* :: y =>
或類似的東西... 其中x
和y
是列表的第一個和最後一個元素..
我該怎麼做..任何想法?
使用從scala.collection
包
原來的答案
object :+ {
def unapply[A](l: List[A]): Option[(List[A], A)] = {
if(l.isEmpty)
None
else
Some(l.init, l.last)
}
}
可作爲:
val first :: (l :+ last) = List(3, 89, 11, 29, 90)
println(first + " " + l + " " + last) // prints 3 List(89, 11, 29) 90
(對於您的情況:case x :: (_ :+ y) if(x == y) => true
)
如果你錯過了很明顯的:
case list @ (head :: tail) if head == list.last => true
的head::tail
部分是有這麼你在空列表上不匹配。
簡單地:
case head +: _ :+ last =>
例如:
scala> val items = Seq("ham", "spam", "eggs")
items: Seq[String] = List(ham, spam, eggs)
scala> items match {
| case head +: _ :+ last => Some((head, last))
| case _ => None
| }
res0: Option[(String, String)] = Some((ham,eggs))
這實際上不適用於具有一個元素的列表。爲此,你必須添加一個額外的案例。 –
從階2.10你可以只使用爲最後DEF最後[T](XS:序號[T])= {XS匹配{ 案例_:+ x => x }},請參閱https://issues.scala-lang.org/browse/SI-2575 –