2013-10-07 73 views
5

我曾在python 在Python中有一个函数.pop()删除列表中的最后一个值,并返回 删除的值 前。 x = [1,2,3,4] x.pop()将返回4.pop()相当于斯卡拉

我想知道是否有一个相当于这个函数的scala?

回答

6

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

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

会给你的最后一个元素(lastEl),所有酒吧的最后一个元素(rest),你仍然也有原来的列表(x)的列表。

+0

只知道,它是如何调用比去年更好,打完电话后得到一个新的列表dropRight(1)? –

+0

'dropRight(1)'也可以完成这项工作(和'x.reverse.tail'以及其他各种可能的调用一样)。尽管输入的字符更少! :) – Shadowlands

+0

不像流行x.reverse.tail将是O(n) –

1

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

val last = x.last 
val rest = x.dropRight(1) 
11

有很多的different collection types Scala中,每一个都有自己的一套支持和/或性能良好的操作。

在斯卡拉,List是一个像Lisp一样的不可变缺陷单元序列。获取last元素不是一个很好的解决方案(head元素很快)。类似地,QueueStack被优化用于特别从一端检索元素和结构的其余部分。如果您的订单被逆转,您可以使用其中任何一种。

否则,Vector是一个很好的执行一般结构是快速既为headlast电话:

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

4

我倾向于使用

val popped :: newList = list 

其分配列表popped的第一个元素,其余名单newList

+1

保持一致时间注意:这会从列表头部(这是第一个,而不是最后一个元素)弹出, – Lucas

0

如果你愿意放松对一成不变的结构需要,总是有栈和队列:

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) 
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 
    }