65 votes

Équivalent en Scala de java.util.ArrayList

Je suis en train de réaliser un projet en Scala, mais je suis assez nouveau dans ce langage et j'ai des connaissances en Java. Je vois que Scala n'a pas d'ArrayList, donc je me demande comment s'appelle l'équivalent Scala de l'ArrayList de Java, et s'il y a des différences importantes entre les versions Java et Scala.

EDITAR: Je ne cherche pas tant un comportement spécifique qu'une représentation interne (données stockées dans un tableau, mais l'ensemble du tableau n'est pas visible, seulement la partie que vous utilisez).

109voto

Daniel C. Sobral Points 159554

Je peux penser à 3 questions plus spécifiques pour répondre aux vôtres :

  • Quelle est la collection par défaut de Scala ?
  • Quelle collection Scala a des caractéristiques similaires à ArrayList ?
  • Quel est un bon remplacement pour Array en Scala ?

Voici donc les réponses à ces questions :

Quelle est la collection par défaut de Scala ?

L'équivalent en Scala de l'équivalent en Java List est l'interface Seq . Il existe également une interface plus générale, qui est la GenSeq -- la principale différence étant qu'un GenSeq peut avoir des opérations traitées en série ou en parallèle, selon l'implémentation.

Parce que Scala permet aux programmeurs d'utiliser Seq en tant qu'usine, ils ne prennent pas souvent la peine de définir une implémentation particulière, à moins qu'ils ne s'y intéressent. Lorsqu'ils le font, ils choisissent généralement l'une ou l'autre des implémentations suivantes de Scala List o Vector . Ils sont tous deux immuables, et Vector a de bonnes performances en matière d'accès indexé. D'un autre côté, List fait très bien les opérations qu'il fait bien.

Quelle collection Scala a des caractéristiques similaires à ArrayList ?

Ce serait scala.collection.mutable.ArrayBuffer .

Quel est un bon remplacement pour Array en Scala ?

Eh bien, la bonne nouvelle, c'est que vous pouvez simplement utiliser Array en Scala ! En Java, Array est souvent évitée en raison de son incompatibilité générale avec les génériques. C'est une collection co-variante, alors que les génériques sont invariants, elle est mutable -- ce qui rend sa co-variance dangereuse, elle accepte des primitives là où les génériques ne le font pas, et elle a un ensemble assez limité de méthodes.

En Scala, Array -- qui est toujours le même Array comme en Java -- est invariant, ce qui fait disparaître la plupart des problèmes. Scala accepte AnyVal (l'équivalent des primitives) comme types pour ses "génériques", même s'il fait de l'auto-boxing. Et par le biais du modèle "enrichir ma bibliothèque", TOUTES de Seq Les méthodes sont disponibles pour Array .

Donc, si vous voulez une plus puissante Array il suffit d'utiliser un Array .

Qu'en est-il d'une collection qui rétrécit et s'agrandit ?

Les méthodes par défaut disponibles pour toutes les collections produisent toutes nouveau des collections. Par exemple, si je fais ça :

val ys = xs filter (x => x % 2 == 0)

Puis ys sera un nouveau tandis que xs sera toujours la même qu'avant cette commande. Ceci est vrai quel que soit le xs était : Array , List etc.

Naturellement, cela a un coût - après tout, vous sont produire une nouvelle collection. Les collections immuables de Scala gèrent bien mieux ce coût car elles sont persistant mais cela dépend de l'opération exécutée.

Aucune collection ne peut faire grand-chose filter mais un List a d'excellentes performances lorsqu'il s'agit de générer une nouvelle collection en ajoutant un élément ou en enlevant la tête - les opérations de base d'une pile, en fait. Vector a de bonnes performances sur un tas d'opérations, mais il n'est rentable que si la collection n'est pas petite. Pour les collections de, disons, jusqu'à une centaine d'éléments, le coût global pourrait dépasser les gains.

Il est donc possible d'ajouter ou de supprimer des éléments à un fichier Array et Scala produira un nouveau Array pour vous, mais vous paierez le coût d'une copie complète si vous le faites.

Les collections mutables de Scala ajoutent quelques autres méthodes. En particulier, les collections qui peuvent augmenter ou diminuer la taille -- sans produire une nouvelle collection -- implémentent la méthode Growable y Shrinkable traits. Ils ne garantissent cependant pas de bonnes performances sur ces opérations, mais ils vous indiqueront les collections que vous souhaitez consulter.

20voto

missingfaktor Points 44003

C'est ArrayBuffer de scala.collection.mutable . Vous pouvez trouver les scaladocs aquí .

0voto

Anony-Mousse Points 24646

Avez-vous jeté un coup d'œil à ArraySeq ?

0voto

jtoberon Points 3928

C'est difficile de dire exactement ce que vous devriez faire parce que vous n'avez pas dit quel comportement de ArrayList que vous êtes intéressé à utiliser. Il est plus utile de penser en termes de traits scala dont vous voulez tirer parti. Voici une bonne explication : http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html .

Cela dit, vous voulez probablement une sorte de IndexedSeq .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X