2012-09-06 20 views
68

एक ही तत्व n-times के साथ सूची कैसे बनाएं?एक ही तत्व n-times के साथ सूची कैसे बनाएं?

मैन्युअल 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) 

वहाँ भी एक अंतर्निहित तरीका भी ऐसा ही करने है?

उत्तर

123

scala.collection.generic.SeqFactory.fill(n:Int)(elem: =>A) देखें कि संग्रह डेटा संरचनाओं, Seq, Stream, Iterator और इतने पर जैसे, विस्तार:

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

चेतावनी यह स्काला 2.7 में उपलब्ध नहीं है।

+0

अधिक जानकारी के लिए GenTraversableFactory देखें, और इस पृष्ठ पर # 14: http://nicholassterling.wordpress.com/2012/01/28/scala-snippets/ – AmigoNico

1

मैं एक जवाब जो emulates flatMap मुझे लगता है कि है

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 लागू करने)} लेकिन यह एक पूर्व निर्धारित सूची के लिए नहीं बल्कि है और आप प्रत्येक तत्व को डुप्लिकेट करना चाहते हैं

6

tabulate का उपयोग करके

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

एक आकर्षण की तरह काम करता है।

संबंधित मुद्दे