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?
Menggunakan
tabulate
seperti ini,List.tabulate(3)(_ => "foo")
sumber
(1 to n).map( _ => "foo" )
Bekerja seperti pesona.
sumber
_
sebenarnya tidak penting. Anda bisa melakukannyan to 1 by -1
,-1 to -n by -1
dll.fill
implementasi 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_
.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
sumber