Як створити список з однаковим елементом 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

Див scala.collection.generic.SeqFactory.fill (п: Int) (ель: => A) , що структури збору даних, як Seq, Stream, Iteratorі так далі, подовжують:

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, на мою думку (з’ясувалося, що це рішення повертає 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 разів на кожен елемент

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.