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.