15

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

我想知道这个函数是否有一个等效的scala?

4

6 回答 6

12

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

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

会给你最后一个元素 ( lastEl),所有 bar 的列表最后一个元素 ( rest),而且你还有原始列表 ( x)。

于 2013-10-07T13:13:55.110 回答
11

Scala中有许多不同的集合类型,每种都有自己的一组受支持和/或性能良好的操作。

在 Scala 中,aList是一个不可变的 cons-cell 序列,就像在 Lisp 中一样。获取last元素不是一个优化好的解决方案(head元素很快)。类似地Queue,并且Stack特别针对从一端检索元素和结构的其余部分进行了优化。如果您的订单颠倒,您可以使用其中任何一个。

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

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

Wherelast将与您的pop操作等效,并且init是删除了最后一个元素的序列(您也可以dropRight(1)按照其他答案中的建议使用)。要仅检索最后一个元素,请使用v.last.

于 2013-10-07T13:17:21.690 回答
7

我倾向于使用

val popped :: newList = list

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

于 2016-03-16T23:46:04.220 回答
3

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

val last = x.last
val rest = x.dropRight(1)
于 2013-10-07T13:16:37.070 回答
1

如果您愿意放松对不可变结构的需求,总有 Stack 和 Queue:

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)
于 2016-10-22T21:14:49.813 回答
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
    }
于 2016-11-09T02:46:19.883 回答