Как создать список с одним и тем же элементом n раз?
Как создать список с одним и тем же элементом n-times?
Вручную:
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)
Есть ли встроенный способ сделать то же самое?
Ответы
Ответ 1
См. scala.collection.generic.SeqFactory.fill(n: Int) (elem: = > A), которые собирают структуры данных, например Seq
, Stream
, Iterator
и т.д., продолжите:
scala> List.fill(3)("foo")
res1: List[String] = List(foo, foo, foo)
ПРЕДУПРЕЖДЕНИЕ Он недоступен в Scala 2.7.
Ответ 2
Используя tabulate
, как это,
List.tabulate(3)(_ => "foo")
Ответ 3
(1 to n).map( _ => "foo" )
Работает как шарм.
Ответ 4
У меня есть еще один ответ, который эмулирует flatMap, я думаю (выяснили, что это решение возвращает Unit при применении 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)(_) }
но это скорее для предопределенного списка, и вы хотите дублировать n раз каждый элемент