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

Scala - конвертировать список списков в один список: список [список [A]] в список [A]

Каков наилучший способ преобразования списка списков в scala (2.9)?

У меня есть список:

List[List[A]]

который я хочу преобразовать в

List[A]

Как это может быть достигнуто рекурсивно? Или есть другой лучший способ?

4b9b3361

Ответ 1

Список имеет метод сглаживания. Почему бы не использовать его?

List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)

Ответ 2

Учитывая приведенный выше пример, я не уверен, что вам нужна рекурсия. Похоже, вы хотите List.flatten вместо этого.

например.

scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)

scala> List(4,5,6)
res1: List[Int] = List(4, 5, 6)

scala> List(res0,res1)
res2: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6)) 

scala> res2.flatten
res3: List[Int] = List(1, 2, 3, 4, 5, 6)

Ответ 3

.flatten, очевидно, самый простой способ, но для полноты вы также должны знать о flatMap

 val l = List(List(1, 2), List(3, 4))
 println(l.flatMap(identity))

и эквивалент для понимания

 println(for (list <- l; x <- list) yield x)

flatten - это, очевидно, частный случай flatMap, который может сделать гораздо больше.

Ответ 4

Если ваша структура может быть далее вложена, например:

List(List(1, 2, 3, 4, List(5, 6, List(7, 8))))

Эта функция должна дать вам желаемый результат:

def f[U](l: List[U]): List[U] = l match {
  case Nil => Nil
  case (x: List[U]) :: tail => f(x) ::: f(tail)
  case x :: tail => x :: f(tail)
}

Ответ 5

Вам не нужна рекурсия, но вы можете использовать ее, если хотите:

def flatten[A](list: List[List[A]]):List[A] = 
  if (list.length==0) List[A]() 
  else list.head ++ flatten(list.tail)

Это работает как метод сглаживания в List. Пример:

scala> flatten(List(List(1,2), List(3,4)))
res0: List[Int] = List(1, 2, 3, 4)

Ответ 6

Если вы хотите использовать flatmap, вот способ

Предположим, что у вас есть список List [Int] с именем ll, и вы хотите преобразовать его в List, многие люди уже дают вам ответы, такие как flatten, таким простым способом. Я предполагаю, что вы просите использовать метод плоской карты. Если это так, то вот путь

ll.flatMap(_.map(o=>o))