web-dev-qa-db-ja.com

Scala-リストのリストを単一のリストに変換:List [List [A]] to List [A]

scala(2.9)のリストのリストを変換する最良の方法は何ですか?

リストがあります:

List[List[A]]

に変換したい

List[A]

どうすれば再帰的に達成できますか?または、他のより良い方法はありますか?

35
A Far

リストにはflattenメソッドがあります。使ってみませんか?

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

上記の例を考えると、再帰が必要かどうかわかりません。 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)
10
Brian Agnew

.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の特殊なケースであり、これによりさらに多くのことが可能になります。

10
Dave Griffith

次のように構造をさらにネストできる場合:

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

再帰は必要ありませんが、必要に応じて使用できます。

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

これは、Listに組み込まれたflattenメソッドのように機能します。例:

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

フラットマップを使用したい場合、ここに方法があります

Llという名前のList [Int]のリストがあり、それをListにフラット化したい場合、多くの人が既に簡単な方法であるflattenなどの答えを与えているとします。私はあなたがflatmapメソッドの使用を求めていると仮定します。もしそうなら、ここに方法があります

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