2013-10-07 71 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 
    }