Скала |Создать новые списки 1-го, 2-го, .., n-го значений списков - PullRequest
0 голосов
/ 10 ноября 2019

Учитывая список списков Scala:

List(List(Some(1),Some(2),Some(3),Some(4)),List(Some(1),Some(2),Some(3),Some(4)),List(Some(1),Some(2),Some(3),Some(4)))

Как мне создать новый список списков:

List(List(Some(1),Some(1),Some(1)),List(Some(2),Some(2),Some(2)),List(Some(3),Some(3),Some(3)),List(Some(4),Some(4),Some(4)))

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

Я попытался вложить .maps() однако я не думаю, что это правильноподходит.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2019

использование transpose метод

val a = List(List(Some(1),Some(2),Some(3),Some(4)),List(Some(1),Some(2),Some(3),Some(4)),List(Some(1),Some(2),Some(3),Some(4)))

a.transpose // List(List(Some(1), Some(1), Some(1)), List(Some(2), Some(2), Some(2)), List(Some(3), Some(3), Some(3)), List(Some(4), Some(4), Some(4)))
0 голосов
/ 10 ноября 2019

Мне нравится решение Рона Нагара.

Однако, поскольку я уже что-то реализовал самостоятельно, я решил поделиться им.

object ListOfListsTest {
  def main(args: Array[String]) = {
    val myList = List(List(Some(1),Some(2),Some(3),Some(4)),List(Some(1),Some(2),Some(3),Some(4)),List(Some(1),Some(2),Some(3),Some(4)))
    println(regroup(myList))
  }

  def regroup[A](list: List[List[A]]): List[List[A]] = {
    def regroupInner[A](l: List[List[A]], acc: List[List[A]]): List[List[A]] = {
      val split = l.flatMap{xs =>
        xs match {
          case y::ys => Some((y, ys))
          case Nil => None
        }
      }
      val splitHead = split.map(_._1)
      val splitTail = split.map(_._2)

      splitTail match {
        case Nil =>
          splitHead match {
            case Nil => acc
            case z::zs => splitHead::acc
          }
        case w::ws =>
          regroupInner(splitTail, splitHead::acc)
      }
    }

    regroupInner(list, List()).reverse
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...