2012-09-06 10 views
68

同じ要素でn回リストを作成するにはどうすればよいですか?同じ要素をn回使ってリストを作成するには?

手動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

は、収集データ構造は、SeqStreamIteratorなどのように、拡張することscala.collection.generic.SeqFactory.fill(n:Int)(elem: =>A)参照してください:

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

WARNINGそれはScalaの2.7では使用できません。

+0

詳細についてはGenTraversableFactoryを参照してください。このページの#14:http://nicholassterling.wordpress.com/2012/01/28/scala-snippets/ – AmigoNico

1

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

と思いますが、これは所定のリストのためにかなりあり、あなたflatMapエミュレートする別の答えを持っています各要素をn回複写したい

6

このようにtabulateを使用すると、

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

魅力的な作品です。

関連する問題