Bagaimana cara membuat daftar dengan elemen yang sama n-kali?

91

Bagaimana cara membuat list dengan elemen yang sama n-times?

Implementasi secara manual:

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)

Apakah ada juga cara bawaan untuk melakukan hal yang sama?

John Threepwood
sumber

Jawaban:

11

Menggunakan tabulateseperti ini,

List.tabulate(3)(_ => "foo")
elm
sumber
9
(1 to n).map( _ => "foo" )

Bekerja seperti pesona.

Danilo M. Oliveira
sumber
@AlonsodelArte Mengapa boros?
k0pernikus
@ k0pernikus Karena nilai _sebenarnya tidak penting. Anda bisa melakukannya n to 1 by -1, -1 to -n by -1dll.
Alonso del Arte
1
@AlonsodelArte Pada akhirnya, seseorang membutuhkan variabel loop sementara. Bahkan fillimplementasi metode membangun variabel sementara secara internal yang nilainya tidak akan menjadi masalah selama menghasilkan jumlah yang tepat dalam daftar. Jadi saya tidak keberatan yang tidak terpakai _.
k0pernikus
1
@ k0pernikus Saya tidak akan keberatan baik di REPL Scala lokal atau dalam potongan Scastie. Tetapi pada proyek profesional, saya akan menganggapnya sebagai alasan yang cukup untuk melakukan refactoring.
Alonso del Arte
1

Saya punya jawaban lain yang mengemulasi flatMap menurut saya (menemukan bahwa solusi ini mengembalikan Unit saat menerapkan duplikatN)

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

tetapi ini lebih untuk List yang telah ditentukan dan Anda ingin menduplikasi setiap elemen sebanyak n kali

Tomás Duhourq
sumber