Scala: карта и распаковать список за один проход - PullRequest
0 голосов
/ 03 мая 2018

У меня есть список кортежей следующим образом:

[(8, 3, 9), (10, 3, 0), (-37, 4, 1)]

Я хотел бы отобразить этот список и одновременно распаковать его за один проход . Вот пример с двумя проходами (или, по крайней мере, я настоятельно полагаю, что это займет два прохода, если нет, то мы здесь закончили)

val l = List((8, 3, 9), (10, 3, 0), (-37, 4, 1))
val (list1, list2) = l.map({ el => (el._1, el._2) }).unzip

Конечно, я мог бы просто сделать это в императивном стиле, перебирая списки и добавляя в коллекцию, но есть ли способ сделать это кратким функциональным способом? Я предполагаю, что по существу мне понадобится ленивый map, за которым следует нетерпеливый unzip.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Всегда есть fold.

val (list1, list2) = l.foldRight((List.empty[Int],List.empty[Int])){
  case ((a,b,_),(l1,l2)) => (a::l1,b::l2)
}
0 голосов
/ 03 мая 2018

Это очень специфично для вашей заявленной проблемы; это не решает более общую проблему. Попробуйте:

val (list1, list2, _) = l.unzip3

Редактировать

Если честно, после определения реализации scala.collection.generic.GenericTraversableTemplate.unzip3 это очень нефункциональный цикл, который создает 3 списка и возвращает их, в значительной степени, как описано в первоначальном вопросе. По крайней мере, это один проход, а не просто похоронить два прохода.

...