web-dev-qa-db-fra.com

Scala pour une boucle sur deux listes simultanément

J'ai un List[Message] et un List[Author] qui ont le même nombre d'éléments et doivent être ordonnés de sorte qu'à chaque index, le Message soit du Author.

J'ai aussi une classe que nous appellerons ici SmartMessage, avec un constructeur prenant 2 arguments: un Message et le Author correspondant.

Ce que je veux faire, c'est créer un List[SmartMessage], combinant les données des 2 listes simples.

Question supplémentaire: List préserve-t-il l'ordre d'insertion dans Scala? Juste pour être sûr de créer List[Message] et un List[Author] avec la même commande.

35
Blackbird

Vous pouvez utiliser Zip:

val ms: List[Message] = ???
val as: List[Author] = ???

var sms = for ( (m, a) <- (ms Zip as)) yield new SmartMessage(m, a)

Si vous n'aimez pas for-comprehensions, Vous pouvez utiliser map:

var sms = (ms Zip as).map{ case (m, a) => new SmartMessage(m, a)}

La méthode Zip crée une collection de paires. Dans ce cas, List[(Message, Author)].

Vous pouvez également utiliser la méthode zipped sur Tuple2 (Et sur Tuple3):

var sms = (ms, as).zipped.map{ (m, a) => new SmartMessage(m, a)}

Comme vous pouvez le voir, vous n'avez pas besoin de correspondance de modèle dans map dans ce cas.

Extra

List est Seq et Seq préserve l'ordre. Voir aperçu des collections scala .

Il existe 3 principales branches de collections: Seq , Set et Map .

  • Seq préserve l'ordre des éléments.
  • Set ne contient aucun élément en double.
  • Map contient des mappages des clés aux valeurs.

List in scala est liste liée , vous devez donc y ajouter des éléments et non les ajouter. Voir Caractéristiques de performance de scala collections.

75
senia