Каков наилучший способ преобразования списка списков в scala (2.9)?
У меня есть список:
List[List[A]]
который я хочу преобразовать в
List[A]
Как это может быть достигнуто рекурсивно? Или есть другой лучший способ?
Каков наилучший способ преобразования списка списков в scala (2.9)?
У меня есть список:
List[List[A]]
который я хочу преобразовать в
List[A]
Как это может быть достигнуто рекурсивно? Или есть другой лучший способ?
Список имеет метод сглаживания. Почему бы не использовать его?
List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
Учитывая приведенный выше пример, я не уверен, что вам нужна рекурсия. Похоже, вы хотите 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)
.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, который может сделать гораздо больше.
Если ваша структура может быть далее вложена, например:
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)
}
Вам не нужна рекурсия, но вы можете использовать ее, если хотите:
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)
Если вы хотите использовать flatmap, вот способ
Предположим, что у вас есть список List [Int] с именем ll, и вы хотите преобразовать его в List, многие люди уже дают вам ответы, такие как flatten, таким простым способом. Я предполагаю, что вы просите использовать метод плоской карты. Если это так, то вот путь
ll.flatMap(_.map(o=>o))