web-dev-qa-db-fra.com

Scala équivalent de Java.util.ArrayList

Je fais un projet dans Scala, mais je suis assez nouveau dans le langage et j'ai un arrière-plan Java. Je vois que Scala n'a pas ArrayList, donc Je me demande comment s'appelle l'équivalent Scala de Java's ArrayList, et s'il existe des différences importantes entre les versions Java et Scala).

EDIT: 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).

63
astay13

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 dans Scala?

Voici donc les réponses à ces questions:

Quelle est la collection par défaut de Scala?

L'équivalent de Scala de l'interface List de Java est le Seq. Une interface plus générale existe également, qui est le 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 comme usine, ils ne se soucient pas souvent de définir une implémentation particulière à moins qu'ils ne s'en soucient. Quand ils le font, ils vont généralement choisissez List ou Vector de Scala. Ils sont tous les deux immuables et Vector a de bonnes performances d'accès indexé. En revanche, List fait très bien le opérations 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 dans Scala?

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

Dans Scala, Array - qui est toujours le même Array que dans 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 fera de l'auto-boxing. Et à travers le modèle "enrichir ma bibliothèque", [~ # ~] toutes les méthodes [~ # ~] Seq sont disponibles pour Array.

Donc, si vous voulez un Array plus puissant, utilisez simplement un Array.

Et une collection qui rétrécit et grandit?

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

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

Alors ys sera une collection nouveau, tandis que xs sera toujours la même qu'avant cette commande. Cela est vrai quel que soit xs: Array, List, etc.

Naturellement, cela a un coût - après tout, vous êtes la production d'une nouvelle collection. Les collections immuables de Scala sont bien meilleures pour gérer ce coût car elles sont persistantes, mais cela dépend de l'opération exécutée.

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

Vous pouvez donc ajouter ou supprimer des éléments à un Array, et Scala produira un nouveauArray pour vous, mais vous paierez le coût d'une copie complète lorsque vous le ferez.

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

106
Daniel C. Sobral

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

20
missingfaktor

Avez-vous regardé ArraySeq?

0
Anony-Mousse

Il est difficile de dire exactement ce que vous devez faire car vous n'avez pas dit quel comportement de ArrayList vous souhaitez utiliser. Il est plus utile de penser en fonction des traits scala dont vous souhaitez profiter. Voici une bonne explication: http://grahamhackingscala.blogspot.com/2010/02/ comment-convertir-Java-list-en-scala-list.html .

Cela dit, vous voulez probablement une sorte de IndexedSeq.

0
jtoberon