scala中的.pop()等价物

时间:2013-10-07 13:04:22

标签: scala

我参与过python 在python中有一个函数.pop(),它删除列表中的最后一个值并返回该值 删除的值 恩。 X = [1,2,3,4] x.pop()将返回4

我想知道这个函数有scala等价吗?

6 个答案:

答案 0 :(得分:11)

Scala中有很多different collection types,每个都有自己的一组受支持和/或表现良好的操作。

在Scala中,List是一个不可变的cons-cell序列,就像在Lisp中一样。获取last元素不是一个优化的解决方案(head元素很快)。类似地,QueueStack被优化用于从一端检索元素和结构的其余部分。如果您的订单相反,您可以使用其中任何一个。

否则,Vector是效果良好的一般结构,对于headlast来说都很快:

val v = Vector(1, 2, 3, 4)
val init :+ last = v  // uses pattern matching extractor `:+` to get both init and last

last等同于pop操作,init是删除最后一个元素的序列(您也可以使用dropRight(1)其他答案)。要只检索最后一个元素,请使用v.last

答案 1 :(得分:7)

如果您只想检索最后一个值,可以拨打x.last。但是,这不会从列表中删除最后一个元素,这是不可变的。相反,您可以调用x.init来获取包含x中除最后一个元素之外的所有元素的列表 - 再次,而不实际更改x。所以:

val lastEl = x.last
val rest = x.init

将为您提供最后一个元素(lastEl),最后一个元素列表(rest),您还有原始列表(x)。< / p>

答案 2 :(得分:4)

我倾向于使用

val popped :: newList = list

将列表的第一个元素分配给popped,将剩余的列表分配给newList

答案 3 :(得分:2)

第一个答案是正确的,但你可以做同样的事情:

val last = x.last
val rest = x.dropRight(1)

答案 4 :(得分:1)

如果你愿意放松对不可变结构的需求,总会有堆栈和队列:

val poppable = scala.collection.mutable.Stack[String]("hi", "ho")
val popped = poppable.pop

类似于Python弹出多个元素的能力,Queue处理:

val multiPoppable = scala.collection.mutable.Queue[String]("hi", "ho")
val allPopped = poppable.dequeueAll(_ => true)

答案 5 :(得分:0)

如果是mutable.Queue,请使用dequeue功能

  /** Returns the first element in the queue, and removes this element
   *  from the queue.
   *
   *  @throws java.util.NoSuchElementException
   *  @return the first element of the queue.
   */
  def dequeue(): A =
    if (isEmpty)
      throw new NoSuchElementException("queue empty")
    else {
      val res = first0.elem
      first0 = first0.next
      decrementLength()
      res
    }