web-dev-qa-db-fra.com

Scala - convertir la liste des listes en une seule liste: liste [liste [A]] en liste [A]

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?

35
A Far

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)
49
Jan

É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)
10
Brian Agnew

.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.

10
Dave Griffith

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)
}
4
Maroun

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)
0
Paweł Janik

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))
0
Robin