在 Scala 中连接多个列表

Concatenating multiple lists in Scala

我有一个名为 generateList 的函数和 concat 函数,如下所示。它本质上是将 generateList 返回的列表与 i 从 24 开始并以 1

结束
 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))

我可以将其转换为尾递归。但我很好奇是否有 scala 方法可以做到这一点?

有很多方法可以使用 Scala 的内置方法来实现这一点。

这是一种使用 foldRight 的方法

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

从用于构建单独列表的整数范围开始,它将 generateList(i) 的结果连接到初始空列表。

这是一种方法:

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 所做的。