Jak stworzyć listę z tym samym elementem n-krotnie?
Wdrożenie ręczne:
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)
Czy istnieje również wbudowany sposób, aby zrobić to samo?
Używając w
tabulate
ten sposób,List.tabulate(3)(_ => "foo")
źródło
(1 to n).map( _ => "foo" )
Działa jak marzenie.
źródło
_
nie ma znaczenia. Można to zrobićn to 1 by -1
,-1 to -n by -1
itp.fill
implementacja metody konstruuje wewnętrznie zmienną tymczasową, której wartość nie miałaby znaczenia, o ile daje odpowiednią wartość na liście. Więc nie mam nic przeciwko nieużywanemu_
.Mam inną odpowiedź, która chyba emuluje flatMap (okazało się, że to rozwiązanie zwraca Unit podczas stosowania 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)(_) }
ale to jest raczej dla z góry określonej listy i chcesz powielić n razy każdy element
źródło