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


90

如何创建具有相同元素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)

还有内置的方法可以做到这一点吗?

Answers:



11

使用tabulate这样的,

List.tabulate(3)(_ => "foo")

9
(1 to n).map( _ => "foo" )

奇迹般有效。


@AlonsodelArte为什么浪费?
k0pernikus

@ k0pernikus因为的值_实际上并不重要。你可以做n to 1 by -1-1 to -n by -1
阿隆索德尔艺术

1
@AlonsodelArte最后,需要一个临时循环变量。甚至该fill方法的实现都在内部构造了一个临时变量,只要它在列表中产生正确的数量,其值就无关紧要。所以我不在乎未使用的 _
k0pernikus

1
@ k0pernikus在本地Scala REPL或Scastie片段中我都不会介意。但是在一个专业项目中,我认为它有足够的理由进行重构。
阿隆索·德尔·阿特

1

我还有一个模拟我认为的flatMap的答案(发现该解决方案在应用重复N时返回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次

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.