我在 python 上工作过在 python 中有一个函数 .pop() 删除列表中的最后一个值并返回删除的值 ex。x=[1,2,3,4] x.pop() 将返回 4
我想知道这个函数是否有一个等效的scala?
我在 python 上工作过在 python 中有一个函数 .pop() 删除列表中的最后一个值并返回删除的值 ex。x=[1,2,3,4] x.pop() 将返回 4
我想知道这个函数是否有一个等效的scala?
如果您只想检索最后一个值,可以调用x.last
. 但是,这不会从列表中删除最后一个元素,这是不可变的。相反,您可以再次调用x.init
以获取由x
除最后一个元素之外的所有元素组成的列表,而无需实际更改x
. 所以:
val lastEl = x.last
val rest = x.init
会给你最后一个元素 ( lastEl
),所有 bar 的列表最后一个元素 ( rest
),而且你还有原始列表 ( x
)。
Scala中有许多不同的集合类型,每种都有自己的一组受支持和/或性能良好的操作。
在 Scala 中,aList
是一个不可变的 cons-cell 序列,就像在 Lisp 中一样。获取last
元素不是一个优化好的解决方案(head
元素很快)。类似地Queue
,并且Stack
特别针对从一端检索元素和结构的其余部分进行了优化。如果您的订单颠倒,您可以使用其中任何一个。
否则,Vector
是一个性能良好的通用结构,对于head
和last
调用都很快:
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
.
我倾向于使用
val popped :: newList = list
它将列表的第一个元素分配给popped
,将剩余的列表分配给newList
第一个答案是正确的,但你可以做到同样的事情:
val last = x.last
val rest = x.dropRight(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)
如果是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
}