41

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

リストがあります:

List[List[A]]

に変換したい

List[A]

どうすればそれを再帰的に達成できますか? それとも他に良い方法はありますか?

4

6 に答える 6

57

リストにはフラット化方式があります。使ってみませんか?

List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
于 2012-09-26T12:05:54.100 に答える
13

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

于 2012-09-26T13:36:57.563 に答える
10

上記の例を考えると、再帰が必要かどうかわかりません。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)
于 2012-09-26T11:40:47.890 に答える
0

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

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)
于 2016-10-22T11:03:43.640 に答える
0

フラットマップを使用する場合は、次の方法があります

ll という名前の List[Int] の List があり、それを List にフラット化したい場合、多くの人がすでに flatten などの答えを提供していますが、これは簡単な方法です。flatmap メソッドの使用を求めていると思います。その場合は、ここに方法があります

ll.flatMap(_.map(o=>o))
于 2018-03-05T21:59:55.457 に答える