array - for scala
Scala for loop en dos listas simultáneamente (1)
Tengo un List[Message]
List[Author]
y un List[Author]
que tienen el mismo número de elementos, y debería ordenarse de modo que en cada índice, el Message
sea del Author
.
También tengo una clase a la que llamaremos aquí SmartMessage
, con un constructor que toma 2 argumentos: un Message
y el Author
correspondiente.
Lo que quiero hacer es crear una List[SmartMessage]
, combinando los datos de las 2 listas simples.
Pregunta extra: ¿La List
conserva el orden de inserción en Scala? Solo para asegurarse de que creo la List[Message]
y una List[Author]
con el mismo pedido.
Podrías usar zip
:
val ms: List[Message] = ???
val as: List[Author] = ???
var sms = for ( (m, a) <- (ms zip as)) yield new SmartMessage(m, a)
Si no te gustan for-comprehensions
puedes usar el map
:
var sms = (ms zip as).map{ case (m, a) => new SmartMessage(m, a)}
Método zip
crea colección de pares. En este caso List[(Message, Author)]
.
También puedes usar el método zipped
en Tuple2
(y en Tuple3
):
var sms = (ms, as).zipped.map{ (m, a) => new SmartMessage(m, a)}
Como puede ver, en este caso no es necesario que el patrón coincida en el map
.
Extra
List
es Seq
y Seq
conserva el orden. Ver resumen de colecciones de scala .
Hay 3 ramas principales de colecciones: Seq , Set y Map .
- Seq conserva el orden de los elementos.
- Set no contiene elementos duplicados.
- Map contiene mapeos de claves a valores.
List
en scala es una lista vinculada , por lo que debe añadirle elementos, no adjuntarlos. Ver Características de rendimiento de las colecciones de scala.