Quelle est la meilleure façon de convertir une liste de listes en scala (2.9)?
J'ai une liste:
List[List[A]]
que je veux convertir en
List[A]
Comment cela peut-il être réalisé de manière récursive? Ou existe-t-il une autre meilleure façon?
La liste a la méthode d'aplatissement. Pourquoi ne pas l'utiliser?
List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
Étant donné l'exemple ci-dessus, je ne suis pas sûr que vous ayez besoin d'une récursivité. On dirait que tu veux List.flatten
au lieu.
par exemple.
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 est évidemment le moyen le plus simple, mais pour être complet, vous devez également connaître flatMap
val l = List(List(1, 2), List(3, 4))
println(l.flatMap(identity))
et l'équivalent pour la compréhension
println(for (list <- l; x <- list) yield x)
flatten est évidemment un cas particulier de flatMap, qui peut faire beaucoup plus.
Si votre structure peut encore être imbriquée, comme:
List(List(1, 2, 3, 4, List(5, 6, List(7, 8))))
Cette fonction devrait vous donner le résultat souhaité:
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)
}
Vous n'avez pas besoin de récursivité mais vous pouvez l'utiliser si vous le souhaitez:
def flatten[A](list: List[List[A]]):List[A] =
if (list.length==0) List[A]()
else list.head ++ flatten(list.tail)
Cela fonctionne comme la méthode d'aplatissement intégrée à List. Exemple:
scala> flatten(List(List(1,2), List(3,4)))
res0: List[Int] = List(1, 2, 3, 4)
Si vous souhaitez utiliser le flatmap, voici le chemin
Supposons que vous ayez une liste de liste [Int] nommée ll, et que vous souhaitiez l'aplatir dans la liste, beaucoup de gens vous donnent déjà les réponses, comme aplatir, c'est le moyen le plus simple. Je suppose que vous demandez l'utilisation de la méthode flatmap. Si c'est le cas, voici la voie
ll.flatMap(_.map(o=>o))