scala中的.pop()等效项

scala中的.pop()等效项,scala,Scala,我在python上工作过 python中有一个函数.pop(),它删除列表中的最后一个值并返回该值 删除值 例x=[1,2,3,4] x、 pop()将返回4 我想知道这个函数是否有scala等价物?如果您只想检索最后一个值,可以调用x.last。但是,这不会从列表中删除最后一个元素,它是不可变的。相反,您可以调用x.init来获得一个列表,该列表由x中除最后一个元素之外的所有元素组成-同样,无需实际更改x。因此: val lastEl = x.last val rest = x.init 将

我在python上工作过 python中有一个函数.pop(),它删除列表中的最后一个值并返回该值 删除值 例x=[1,2,3,4] x、 pop()将返回4


我想知道这个函数是否有scala等价物?

如果您只想检索最后一个值,可以调用
x.last
。但是,这不会从列表中删除最后一个元素,它是不可变的。相反,您可以调用
x.init
来获得一个列表,该列表由
x
中除最后一个元素之外的所有元素组成-同样,无需实际更改
x
。因此:

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

将为您提供最后一个元素(
lastEl
),最后一个元素的所有栏的列表(
rest
),并且您仍然拥有原始列表(
x
)。

第一个答案是正确的,但您可以实现相同的操作:

val last = x.last
val rest = x.dropRight(1)
Scala中有很多操作,每个都有自己的一组受支持和/或性能良好的操作

在Scala中,
列表
是一个不可变的cons单元格序列,就像Lisp中一样。获取
最后一个
元素不是一个很好的优化解决方案(头部元素很快)。类似地,
队列
堆栈
也进行了优化,以便从一端检索元素和结构的其余部分。如果您的订单被颠倒,您可以使用其中任何一个

否则,
Vector
是一种性能良好的通用结构,对于
head
last
调用都很快:

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

我倾向于使用

val popped :: newList = list

它将列表的第一个元素分配给弹出的
,将剩余的列表分配给
新列表
,如果您愿意放松对不可变结构的需求,则始终存在堆栈和队列:

val poppable = scala.collection.mutable.Stack[String]("hi", "ho")
val popped = poppable.pop
与Python弹出多个元素的能力类似,队列处理:

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

如果它是可变的。队列
,请使用
出列
功能

  /** 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
    }

只想知道,在调用dropRight(1)后,如何比最后一次调用更好并获得一个新列表?
dropRight(1)
也可以完成这项工作(以及
x.reverse.tail
和其他各种可能的调用)。但要键入的字符更少!:)与pop x.reverse.tail不同的是,O(n)@om nom nom True,不同选项之间存在性能差异-如果性能在这里是一个问题,则使用另一种数据结构,例如
Vector
Queue
(根据@0的回答),或者重构你的代码,使你最想要的元素在列表的前面找到,而不是后面,可能是更好的选择。如果使用列表,考虑改变ALGO的顺序:<代码> Val-Friste= x.Head;val rest=x.tail
应该是列表的固定时间注意:这从列表的开头弹出(它是第一个而不是最后一个元素)