Como criar uma lista com o mesmo elemento n vezes?

90

Como criar uma lista com o mesmo elemento n vezes?

Implementação 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 também uma maneira integrada de fazer o mesmo?

John Threepwood
fonte

Respostas:

11

Usando tabulateassim,

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

Funciona como um encanto.

Danilo M. Oliveira
fonte
@AlonsodelArte Por que é um desperdício?
k0pernikus
@ k0pernikus Porque o valor de _não importa. Você poderia fazer n to 1 by -1, -1 to -n by -1etc.
Alonso del Arte
@AlonsodelArte No final, é necessária uma variável de loop temporário. Mesmo a fillimplementação do método constrói internamente uma variável temporária cujo valor não importaria, contanto que produza a quantidade certa na lista. Portanto, não me importo com o não utilizado _.
k0pernikus
1
@ k0pernikus Eu não me importaria nem no Scala REPL local ou em um trecho do Scastie. Mas em um projeto profissional, eu consideraria motivo suficiente para refatorar.
Alonso del Arte
1

Eu tenho outra resposta que emula flatMap, eu acho (descobri que esta solução retorna Unit ao 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)(_) }

mas isso é para uma lista predeterminada e você deseja duplicar n vezes cada elemento

Tomás Duhourq
fonte