¿Cómo crear una lista con el mismo elemento n veces?

90

¿Cómo crear una lista con el mismo elemento n veces?

Implementación manual:

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)

¿Existe también una forma incorporada de hacer lo mismo?

John Threepwood
fuente

Respuestas:

11

Usando tabulateasí,

List.tabulate(3)(_ => "foo")
olmo
fuente
9
(1 to n).map( _ => "foo" )

Funciona de maravilla.

Danilo M. Oliveira
fuente
@AlonsodelArte ¿Por qué es un desperdicio?
k0pernikus
@ k0pernikus Porque el valor de en _realidad no importa. Podrías hacer n to 1 by -1, -1 to -n by -1etc.
Alonso del Arte
1
@AlonsodelArte Al final, se necesita una variable de ciclo temporal. Incluso la fillimplementación del método construye una variable temporal internamente cuyo valor no importaría siempre que produzca la cantidad correcta en la lista. Así que no me importa lo que no se usa _.
k0pernikus
1
@ k0pernikus No me importaría ni en el Scala REPL local ni en un fragmento de Scastie. Pero en un proyecto profesional, lo consideraría motivo suficiente para refactorizar.
Alonso del Arte
1

Tengo otra respuesta que emula flatMap, creo (descubrí que esta solución devuelve Unit al aplicar duplicateN)

 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)(_) }

pero esto es más bien para una Lista predeterminada y desea duplicar n veces cada elemento

Tomás Duhourq
fuente