Подтвердить что ты не робот

Scala для цикла по двум спискам одновременно

У меня есть List[Message] и a List[Author], которые имеют одинаковое количество элементов и должны быть упорядочены так, чтобы в каждом индексе Message был из Author.

У меня также есть класс, который мы назовем здесь SmartMessage, причем конструктор принимает 2 аргумента: a Message и соответствующий Author.

Что я хочу сделать, это создать List[SmartMessage], объединив данные двух простых списков.

Дополнительный вопрос: List сохранить порядок вставки в Scala? Просто убедитесь, что я создаю List[Message] и List[Author] с тем же заказом.

4b9b3361

Ответ 1

Вы можете использовать zip:

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

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

Если вам не нравится for-comprehensions, вы можете использовать map:

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

Метод zip создает коллекцию пар. В этом случае List[(Message, Author)].

Вы также можете использовать метод zipped на Tuple2 (и на Tuple3):

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

Как вы можете видеть, в этом случае вам не требуется сопоставление шаблонов в map.

Extra

List является Seq, а Seq сохраняет порядок. См. scala обзор коллекций.

Существует 3 основных раздела коллекций: Seq, Set и Map.

  • Seq сохраняет порядок элементов.
  • Set не содержит повторяющихся элементов.
  • Map содержит сопоставления от ключей к значениям.

List в scala является связанным списком, поэтому вы должны добавлять к нему элементы, а не добавлять. См. Характеристики производительности коллекций scala.