100

如何创建具有相同元素 n 次的列表?

手动实现:

scala> def times(n: Int, s: String) =
 | (for(i <- 1 to n) yield s).toList
times: (n: Int, s: String)List[String]

scala> times(3, "foo")
res4: List[String] = List(foo, foo, foo)

是否还有一种内置方法可以做到这一点?

4

4 回答 4

185

请参阅scala.collection.generic.SeqFactory.fill(n:Int)(elem: =>A)收集数据结构,如Seq,StreamIterator,扩展:

scala> List.fill(3)("foo")
res1: List[String] = List(foo, foo, foo)

警告它在 Scala 2.7 中不可用。

于 2012-09-06T12:31:48.997 回答
12

tabulate像这样使用,

List.tabulate(3)(_ => "foo")
于 2016-03-24T12:25:38.430 回答
12
(1 to n).map( _ => "foo" )

奇迹般有效。

于 2017-05-26T19:48:59.807 回答
1

我有另一个模拟我认为的 flatMap 的答案(发现此解决方案在应用 duplicateN 时返回 Unit)

 implicit class ListGeneric[A](l: List[A]) {
  def nDuplicate(x: Int): List[A] = {
    def duplicateN(x: Int, tail: List[A]): List[A] = {
      l match {
       case Nil => Nil
       case n :: xs => concatN(x, n) ::: duplicateN(x, xs)
    }
    def concatN(times: Int, elem: A): List[A] = List.fill(times)(elem)
  }
  duplicateN(x, l)
}

}

def times(n: Int, ls: List[String]) = ls.flatMap{ List.fill(n)(_) }

但这是针对预先确定的列表,并且您希望将每个元素复制 n 次

于 2014-12-10T15:56:58.727 回答