2013-10-07 10 views
5

Ja pracowałem na pytona W python jest .pop function(), która usuwa ostatnią wartość na liście i powróci że usunięty wartość ex. x = [1,2,3,4] x.pop() zwróci 4.pop() równowartość w Scala

Zastanawiam się, czy istnieje odpowiednik scala dla tej funkcji?

Odpowiedz

6

Jeśli chcesz odzyskać ostatnią wartość, możesz zadzwonić pod numer x.last. Nie spowoduje to jednak usunięcia ostatniego elementu z listy, który jest niezmienny. Zamiast tego możesz zadzwonić pod numer x.init, aby uzyskać listę zawierającą wszystkie elementy z x, z wyjątkiem ostatniego - ponownie, bez faktycznej zmiany x. Więc:

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

daje ostatni element (lastEl), wykaz wszystkich barów ostatni element (rest) i nadal mieć również oryginalne listy (x).

+0

Wystarczy wiedzieć, jak to jest lepiej niż w ubiegłym dzwoni i uzyskać nową listę po wywołaniu dropRight (1)? –

+0

'dropRight (1)' również wykona zadanie (podobnie jak "x.reverse.tail" i różne inne możliwe wywołania). Mniej znaków do wpisania! :) – Shadowlands

+0

w przeciwieństwie do pop x.reverse.tail będzie O (n) –

1

Pierwsza odpowiedź jest poprawna, ale można osiągnąć ten sam robi:

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

Istnieje wiele different collection types w Scala, każdy z własnym zestawem wspieranych operacji i/lub dobre wyniki.

W Scala, List jest niezmienną sekwencją przeciw-komórkową, jak w Lisp. Uzyskiwanie elementu last nie jest dobrze zoptymalizowanym rozwiązaniem (element head jest szybki). Podobnie, Queue i Stack są zoptymalizowane do pobierania elementu i reszty struktury z jednego końca w szczególności. Możesz użyć któregokolwiek z nich, jeśli twoje zamówienie jest odwrócone.

Inaczej Vector jest dobrym wykonaniem ogólna struktura, która jest szybko zarówno dla head i last rozmowy:

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

Gdzie last będzie równowartość operacji pop i init jest sekwencja z ostatniego elementu usunięty (możesz również użyć dropRight(1) zgodnie z sugestią w innych odpowiedziach). Aby pobrać ostatni element, użyj v.last.

4

I mają tendencję do używania

val popped :: newList = list 

który przydziela pierwszy element listy do popped a pozostałe listy do newList

+1

Uwaga: ta wyskakuje z nagłówka listy (która jest pierwszym, nie ostatnim elementem) – Lucas

0

Jeśli jesteś gotów na relaks potrzebę struktur niezmiennych, zawsze stosu i kolejki:

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

podobne do zdolności Pythona do pop wiele elementów, które obsługuje kolejki:

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

Jeśli jest mutable.Queue użyć dequeue funkcja

/** 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 
    } 
Powiązane problemy