2012-09-06 15 views
68

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

manualmente implementnation:

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) 

¿Hay también una manera integrada para hacer lo mismo?

Respuesta

123

Ver scala.collection.generic.SeqFactory.fill(n:Int)(elem: =>A) que las estructuras de datos de colección, como Seq, Stream, Iterator y así sucesivamente, se extienden:

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

ADVERTENCIA No está disponible en Scala 2.7.

+0

Vea GenTraversableFactory para más información, y # 14 en esta página: http://nicholassterling.wordpress.com/2012/01/28/scala-snippets/ – AmigoNico

1

tengo otra respuesta que emula flatMap pienso (descubierto que esta solución vuelve Unidad 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 de una lista predeterminada y desea duplicar n veces cada elemento

6

Usando tabulate así,

List.tabulate(3)(_ => "foo") 
4
(1 to n).map(_ => "foo") 

Funciona como un encanto.

Cuestiones relacionadas