2012-09-06 31 views
68

N-times aynı öğe ile bir liste nasıl oluşturulur?Aynı öğe n-times ile bir liste nasıl oluşturulur?

Manuel 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) 

da aynı şeyi yerleşik bir yolu var mı?

cevap

123

toplama veri yapıları, Seq, Stream, Iterator ve benzeri gibi uzanması scala.collection.generic.SeqFactory.fill(n:Int)(elem: =>A) bakınız:

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

UYARI O Scala 2.7 mevcut değil.

+0

Daha fazla bilgi için bkz: GenTraversableFactory ve # 14 bu sayfada: http://nicholassterling.wordpress.com/2012/01/28/scala-snippets/ – AmigoNico

1

sanırım flatMap emüle başka cevabım var}

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

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

(duplicateN uygularken bu çözüm Birimi döndüren öğrendim) ama bu önceden belirlenmiş Listesi için oldukça olduğunu ve her bir öğenin n çarpılarını çoğaltmak istiyorum

6

tabulate kullanarak,

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

Bir çekicilik gibi çalışır.

İlgili konular