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).
Je peux penser à 3 questions plus spécifiques pour répondre aux vôtres:
ArrayList
?Array
dans Scala?Voici donc les réponses à ces questions:
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.
ArrayList
?Ce serait scala.collection.mutable.ArrayBuffer
.
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
.
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.
C'est ArrayBuffer
de scala.collection.mutable
. Vous pouvez trouver les scaladocs ici .
Avez-vous regardé ArraySeq
?
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
.