2016-06-25 1 views
0

私は以下のようにgenerateListとconcatという関数を持っています。これは本質的に、generateListによって返されたリストを、24で始まり1で終わるように連結しています。Scalaで複数のリストを連結する

def concat(i: Int, l: List[(String, Int)]) : List[(String, Int)] = { 
      if (i==1) l else l ::: concat(i-1, generateList(signs, i)) 
} 
val all = concat(23, generateList(signs, 24)) 

これを末尾再帰に変換できます。しかし、これを行うスケーラの方法があれば私は興味がありますか?

答えて

1

Listで利用できるScalaの組み込みメソッドでこれを行う方法はたくさんあります。ここで

はあなたが別々のリストを構築するために使用intの範囲を皮切りfoldRight

(1 to 24).foldRight(List[Int]())((i, l) => l ::: generateList(i)) 

を使用しています一つのアプローチがあり、それは最初の空のリストにgenerateList(i)の結果をconcats。ここで

0

は、これを行うための一つの方法です:あなたが何をしたいか

val signs = "" 
def generateList(s: String, n: Int) = n :: n * 2 :: Nil 


scala> (24 to 1 by -1) flatMap (generateList(signs, _)) 
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(24, 48, 23, 46, 22, 44, 21, 42, 20, 40, 19, 38, 18, 36, 17, 34, 16, 32, 15, 30, 14, 28, 13, 26, 12, 24, 11, 22, 10, 20, 9, 18, 8, 16, 7, 14, 6, 12, 5, 10, 4, 8, 3, 6, 2, 4, 1, 2) 

x => generateList(signs, x)機能付きリストをマッピングして、結果を連結、すなわちリストを平坦化することです。これはちょうどflatMapのことです。

関連する問題