scala中的.pop()等效项
我在python上工作过 python中有一个函数.pop(),它删除列表中的最后一个值并返回该值 删除值 例x=[1,2,3,4] x、 pop()将返回4scala中的.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 将
我想知道这个函数是否有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
应该是列表的固定时间注意:这从列表的开头弹出(它是第一个而不是最后一个元素)