for array scala scala-collections

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.