scala(2.9)でリストのリストを変換する最良の方法は何ですか?
リストがあります:
List[List[A]]
に変換したい
List[A]
どうすればそれを再帰的に達成できますか? それとも他に良い方法はありますか?
リストにはフラット化方式があります。使ってみませんか?
List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)
.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.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)
再帰は必要ありませんが、必要に応じて使用できます。
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)
フラットマップを使用する場合は、次の方法があります
ll という名前の List[Int] の List があり、それを List にフラット化したい場合、多くの人がすでに flatten などの答えを提供していますが、これは簡単な方法です。flatmap メソッドの使用を求めていると思います。その場合は、ここに方法があります
ll.flatMap(_.map(o=>o))