Aynı eleman n kez ile bir liste nasıl oluşturulur?


93

Aynı eleman n kez ile bir liste nasıl oluşturulur?

El ile uygulama:

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)

Aynı şeyi yapmanın yerleşik bir yolu da var mı?

Yanıtlar:




10
(1 to n).map( _ => "foo" )

Tıkır tıkır çalışıyor.


@AlonsodelArte Neden savurgan?
k0pernikus

@ k0pernikus Çünkü değeri _aslında önemli değil. Sen yapabilirsin n to 1 by -1, -1 to -n by -1vb
Alonso del Arte

1
@AlonsodelArte Sonunda, geçici bir döngü değişkenine ihtiyaç vardır. fillYöntemin uygulaması bile, listede doğru miktarı ürettiği sürece değeri önemli olmayan dahili olarak geçici bir değişken oluşturur. Bu yüzden kullanılmayanları umursamıyorum _.
k0pernikus

1
@ k0pernikus Yerel Scala REPL veya Scastie pasajında ​​bunu umursamıyorum. Ancak profesyonel bir projede, yeniden düzenleme için yeterli olduğunu düşünürdüm.
Alonso del Arte

1

FlatMap'i taklit eden başka bir cevabım var sanırım (bu çözümün duplicateN uygularken Unit döndürdüğünü öğrendim)

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

ancak bu daha çok önceden belirlenmiş bir Liste içindir ve her bir öğeyi n kez çoğaltmak istiyorsunuz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.