同じ要素を持つリストをn回作成する方法は?


90

同じ要素を持つリストをn回作成する方法は?

手動での実装:

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)

同じことをする組み込みの方法もありますか?

回答:


164

参照:(=> Aのelem):scala.collection.generic.SeqFactory.fill(N INT)収集データ構造は、のようなことをSeqStreamIteratorというように、拡張します。

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

警告 Scala 2.7では利用できません。


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


9
(1 to n).map( _ => "foo" )

魅力のように機能します。


@AlonsodelArteなぜそれが無駄なのですか?
k0pernikus

@ k0pernikusの値は_実際には重要ではないため。あなたは何ができるn to 1 by -1-1 to -n by -1など
アロンソ・デル・アルテ

1
@AlonsodelArte最後に、一時的なループ変数が必要です。fillメソッドの実装でさえ、一時変数を内部的に構築します。一時変数は、リストに適切な量を生成する限り、その値は重要ではありません。だから私は未使用を気にしません _
k0pernikus

1
@ k0pernikusローカルのScala REPLでも、Scastieスニペットでもかまいません。しかし、プロのプロジェクトでは、それをリファクタリングするのに十分な理由だと思います。
アロンソデルアルテ

1

私が思うflatMapをエミュレートする別の答えがあります(duplicateNを適用すると、このソリューションはUnitを返すことがわかります)

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

しかし、これは事前に定義されたリスト用であり、各要素をn回複製したい

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.