Esistono diversi modi per costruire un elenco immutabile in Scala (vedere il codice di esempio forzato di seguito). Puoi utilizzare un ListBuffer mutabile, creare un elenco var
e modificarlo, utilizzare un metodo tail recursive e probabilmente altri che non conosco.Modo preferito per creare un elenco Scala
Istintivamente, utilizzo ListBuffer, ma non ho una buona ragione per farlo. Esiste un metodo preferito o idiomatico per la creazione di un elenco o esistono situazioni migliori per un metodo rispetto a un altro?
import scala.collection.mutable.ListBuffer
// THESE are all the same as: 0 to 3 toList.
def listTestA() ={
var list:List[Int] = Nil
for(i <- 0 to 3)
list = list ::: List(i)
list
}
def listTestB() ={
val list = new ListBuffer[Int]()
for (i <- 0 to 3)
list += i
list.toList
}
def listTestC() ={
def _add(l:List[Int], i:Int):List[Int] = i match {
case 3 => l ::: List(3)
case _ => _add(l ::: List(i), i +1)
}
_add(Nil, 0)
}
'Cosa non ti fare è utilizzare una lista e aggiungere alla Liechtenstein attua È perché viene creato un ** nuovo elenco **? Considerando che, utilizzando un'operazione di antefatto non verrà creato un nuovo elenco? –
@KevinMeredith Sì. Aggiungi è O (n), antepone è O (1). –
@pgoggijr Questo non è vero. Innanzitutto, non c'è "cambiamento" da nessuna parte, perché è immutabile. È richiesto un attraversamento perché tutti gli elementi devono essere copiati, solo così una copia dell'ultimo elemento può essere fatta puntare a un nuovo elemento invece di 'Nil'. In secondo luogo, non ci sono copie di alcun tipo su ante: viene creato un elemento che punta all'elenco esistente e il gioco è fatto. –