Je vais développer un peu mon commentaire. La List[T]
structure des données scala.collection.immutable
est optimisée pour fonctionner comme une liste immuable dans un langage de programmation plus purement fonctionnel. Il a des temps de préparation très rapides et il est supposé que vous travaillerez sur la tête pour presque tout votre accès.
Les listes immuables ont des temps de préparation très rapides car elles modélisent leurs listes liées comme une série de "contre-cellules". La cellule définit une valeur unique et un pointeur sur la cellule suivante (style classique de liste à liaison unique):
Cell [Value| -> Nil]
Lorsque vous ajoutez à une liste, vous créez vraiment une seule nouvelle cellule, le reste de la liste existante étant pointé vers:
Cell [NewValue| -> [Cell[Value| -> Nil]]
Parce que la liste est immuable, vous pouvez le faire sans aucune copie réelle . Il n'y a aucun danger que l'ancienne liste change et que toutes les valeurs de votre nouvelle liste deviennent invalides. Cependant, vous perdez la possibilité d'avoir un pointeur modifiable à la fin de votre liste comme compromis.
Cela se prête très bien à un travail récursif sur des listes. Disons que vous avez défini votre propre version de filter
:
def deleteIf[T](list : List[T])(f : T => Boolean): List[T] = list match {
case Nil => Nil
case (x::xs) => f(x) match {
case true => deleteIf(xs)(f)
case false => x :: deleteIf(xs)(f)
}
}
C'est une fonction récursive qui fonctionne exclusivement depuis le début de la liste, et tire parti de la correspondance de motifs via l'extracteur ::. C'est quelque chose que vous voyez beaucoup dans des langues comme Haskell.
Si vous voulez vraiment des ajouts rapides, Scala propose de nombreuses structures de données mutables et immuables. Du côté mutable, vous pourriez vous pencher sur ListBuffer
. Alternativement, à Vector
partir de scala.collection.immutable
a un temps d'ajout rapide.