我曾在python 在Python中有一个函数.pop()删除列表中的最后一个值,并返回 删除的值 前。 x = [1,2,3,4] x.pop()将返回4.pop()相当于斯卡拉
我想知道是否有一个相当于这个函数的scala?
我曾在python 在Python中有一个函数.pop()删除列表中的最后一个值,并返回 删除的值 前。 x = [1,2,3,4] x.pop()将返回4.pop()相当于斯卡拉
我想知道是否有一个相当于这个函数的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)
有很多的different collection types Scala中,每一个都有自己的一套支持和/或性能良好的操作。
在斯卡拉,List
是一个像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
。
我倾向于使用
val popped :: newList = list
其分配列表popped
的第一个元素,其余名单newList
保持一致时间注意:这会从列表头部(这是第一个,而不是最后一个元素)弹出, – Lucas
如果你愿意放松对一成不变的结构需要,总是有栈和队列:
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)
如果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
}
只知道,它是如何调用比去年更好,打完电话后得到一个新的列表dropRight(1)? –
'dropRight(1)'也可以完成这项工作(和'x.reverse.tail'以及其他各种可能的调用一样)。尽管输入的字符更少! :) – Shadowlands
不像流行x.reverse.tail将是O(n) –