我参与过python 在python中有一个函数.pop(),它删除列表中的最后一个值并返回该值 删除的值 恩。 X = [1,2,3,4] x.pop()将返回4
我想知道这个函数有scala等价吗?
答案 0 :(得分:11)
Scala中有很多different collection types,每个都有自己的一组受支持和/或表现良好的操作。
在Scala中,List
是一个不可变的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
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
}