Ceci est une question de suivi pour Non Scala liste mutable
Je souhaite utiliser une liste modifiable dans Scala. Je peux choisir parmi
scala.collection.mutable.DoubleLinkedList
scala.collection.mutable.LinkedList
scala.collection.mutable.ListBuffer
scala.collection.mutable.MutableList
Ce qui est bien, mais quel est le "standard", recommandé, idiomatique scala? Je veux juste utiliser une liste à laquelle je peux ajouter des choses à l'arrière.
Dans mon cas, j'utilise un HashMap, où les "listes" (je veux dire au sens général) seront du côté de la valeur. Ensuite, je lis quelque chose dans un fichier et pour chaque ligne, je veux trouver la bonne liste dans la table de hachage et ajouter la valeur à la liste.
Pour le plaisir des lecteurs qui visitent cette vieille question: La section Concrete Mutable Collection Classes de la documentation a un aperçu des classes de liste modifiables, y compris des explications sur le moment de les utiliser.
Cela dépend de ce dont vous avez besoin.
DoubleLinkedList
est une liste chaînée qui vous permet de faire des va-et-vient dans la liste des nœuds. Utilisez ses références prev
et next
pour aller au nœud précédent ou suivant, respectivement.
LinkedList
est une liste liée individuellement, il n'y a donc pas de pointeurs prev
- si vous ne faites que passer à l'élément suivant de la liste tout le temps, c'est ce dont vous avez besoin.
EDIT: Notez que les deux ci-dessus sont destinés à être utilisés en interne comme blocs de construction pour des structures de liste plus compliquées comme MutableList
s qui prennent en charge l'ajout efficace et mutable.Queue
S.
Les deux collections ci-dessus ont toutes deux des opérations d'ajout en temps linéaire.
ListBuffer
est une classe tampon. Bien qu'il soit soutenu par une structure de données de liste liée individuellement, il n'expose pas le pointeur next
au client, vous ne pouvez donc le parcourir qu'à l'aide d'itérateurs et de foreach
. Son utilisation principale est cependant un tampon et un générateur de liste immuable - vous y ajoutez des éléments via +=
, Et lorsque vous appelez result
, vous récupérez très efficacement une fonction immutable.List
. Contrairement aux listes mutables et immuables, les opérations d'ajout et de pré-ajout sont à temps constant - vous pouvez ajouter à la fin via +=
Très efficacement.
MutableList
est utilisé en interne, vous ne l'utilisez généralement pas sauf si vous prévoyez d'implémenter une classe de collection personnalisée basée sur la structure de données de liste liée individuellement. Les files d'attente mutables, par exemple, héritent de cette classe. La classe MutableList
possède également une opération d'ajout efficace à temps constant, car elle conserve une référence au dernier nœud de la liste.
Si vous souhaitez ajouter des éléments, vous ne devez pas du tout utiliser un List
. List
s sont utiles lorsque vous souhaitez ajouter des éléments. Utilisez ArrayBuffer
à la place.
Je veux juste utiliser une liste à laquelle je peux ajouter des choses au verso.
Choisissez ensuite quelque chose qui implémente Growable
. Je suggère personnellement une des implémentations Buffer
.
Je reste à l'écart de LinkedList
et DoubleLinkedList
, car ils sont présents principalement en tant qu'implémentation sous-jacente d'autres collections, mais ont quelques bugs jusqu'à Scala 2.9. x. À partir de Scala 2.10.0, je m'attends à ce que les diverses corrections de bogues les aient mis aux normes. Pourtant, il leur manque certaines méthodes que les gens attendent, telles que +=
, que vous trouverez sur les collections basées sur eux.