2013-10-07 14 views
5

ho lavorato su pitone in Python esiste una funzione .pop(), che cancellare l'ultimo valore in un elenco e tornare che cancellato il valore es. x = [1,2,3,4] x.pop() restituirà 4.pop() equivalente in scala

Mi chiedevo se esiste una scala equivalente per questa funzione?

risposta

6

Se si desidera solo recuperare l'ultimo valore, è possibile chiamare x.last. Ciò tuttavia non rimuoverà l'ultimo elemento dall'elenco, che è immutabile. Invece, è possibile chiamare x.init per ottenere un elenco costituito da tutti gli elementi in x eccetto l'ultimo - di nuovo, senza effettivamente cambiare x. Quindi:

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

vi darà l'ultimo elemento (lastEl), l'elenco di tutte bar l'ultimo elemento (rest), e ancora hanno anche la lista originale (x).

+0

solo sapere, come è meglio che chiamare scorso e ottenere una nuova lista dopo aver chiamato dropRight (1)? –

+0

'dropRight (1)' farà anche il lavoro (così come 'x.reverse.tail', e varie altre chiamate possibili). Meno caratteri da digitare, però! :) – Shadowlands

+0

a differenza di pop x.reverse.tail sarà O (n) –

1

La prima risposta è corretta, ma è possibile ottenere lo stesso facendo:

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

Ci sono un sacco di different collection types a Scala, ognuno con il proprio insieme di operazioni che svolgono supportati e/o ben.

In Scala, una List è una sequenza di celle di controllo immutabile come in Lisp. Ottenere l'elemento last non è una soluzione ottimizzata (l'elemento head è veloce). Allo stesso modo, Queue e Stack sono ottimizzati per il recupero di un elemento e del resto della struttura da un'estremità in particolare. Puoi utilizzare uno di questi se il tuo ordine è annullato.

Altrimenti, Vector è un buon eseguendo struttura generale che è veloce sia per head e last chiamate:

val v = Vector(1, 2, 3, 4) 
val init :+ last = v // uses pattern matching extractor `:+` to get both init and last 

Dove last sarebbe l'equivalente del funzionamento pop, e init è la sequenza con l'ultimo elemento rimosso (è anche possibile utilizzare dropRight(1) come suggerito nelle altre risposte). Per recuperare l'ultimo elemento, utilizzare v.last.

4

Io tendo ad usare

val popped :: newList = list 

che assegna il primo elemento della lista per popped e l'elenco rimanente per newList

+1

Nota: questo appare dalla testa della lista (che è il primo, non l'ultimo, elemento) – Lucas

0

Se siete disposti a rilassare la necessità di strutture immutabili, c'è sempre Stack e coda:

val poppable = scala.collection.mutable.Stack[String]("hi", "ho") 
val popped = poppable.pop 

simile alla capacità di Python al pop più elementi, Queue maniglie che:

val multiPoppable = scala.collection.mutable.Queue[String]("hi", "ho") 
val allPopped = poppable.dequeueAll(_ => true) 
0

Se è mutable.Queue, utilizzare la funzione 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 
    }