【问题标题】:Scala Get First and Last elements of List using Pattern MatchingScala使用模式匹配获取列表的第一个和最后一个元素
【发布时间】:2011-10-05 13:46:37
【问题描述】:

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

我想做类似的事情..

case List(x, _*, y) if(x == y) => true

case x :: _* :: y =>

或类似的东西... 其中xy 是列表的第一个和最后一个元素..

我该怎么做……有什么想法吗?

【问题讨论】:

标签: scala functional-programming pattern-matching


【解决方案1】:

使用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

【讨论】:

【解决方案2】:

如果你错过了明显的:

case list @ (head :: tail) if head == list.last => true

head::tail 部分在那里,因此您不会在空列表中匹配。

【讨论】:

    【解决方案3】:

    简单地说:

    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 List(head) => Some((head, head))
         |   case _ => None
         | }
    res0: Option[(String, String)] = Some((ham,eggs))
    

    【讨论】:

    • 这实际上不适用于具有一个元素的列表。为此,您必须添加一个额外的案例。
    【解决方案4】:

    让我们理解一下这个问题的相关概念,'::'、'+:'和':+'是有区别的:

    第一个操作员

    '::' - 右结合运算符,特别适用于列表

    scala> val a :: b :: c = List(1,2,3,4)
    a: Int = 1
    b: Int = 2
    c: List[Int] = List(3, 4)
    

    第二操作员

    '+:' - 它也是右结合运算符,但它适用于比列表更通用的 seq。

    scala> val a +: b +: c = List(1,2,3,4)
    a: Int = 1
    b: Int = 2
    c: List[Int] = List(3, 4)
    

    第三操作员

    ':+' - 它也是左结合运算符,但它适用于比列表更通用的 seq

    scala> val a :+ b :+ c = List(1,2,3,4)
    a: List[Int] = List(1, 2)
    b: Int = 3
    c: Int = 4
    

    运算符的结合性由运算符的最后一个字符决定。以冒号“:”结尾的运算符是右结合的。所有其他运算符都是左结合的。

    左关联二元运算 e1;op;e2 被解释为 e1.op(e2)

    如果 op 是右结合,同样的操作被解释为 { val x=e1; e2.op(x) },其中 x 是一个新名称。

    现在回答您的问题: 所以现在如果您需要从列表中获取第一个和最后一个元素,请使用以下代码

    scala> val firstElement +: b :+ lastElement = List(1,2,3,4)
    firstElement: Int = 1
    b: List[Int] = List(2, 3)
    lastElement: Int = 4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多