จะสร้างรายการที่มีองค์ประกอบเดียวกัน n-times ได้อย่างไร?


92

จะสร้างรายการที่มีองค์ประกอบเดียวกัน 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)

มีวิธีการทำแบบเดียวกันในตัวหรือไม่?

คำตอบ:


168

ดู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


ดู 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ฯลฯ
อลอนโซ่เด Arte

1
@AlonsodelArte ในท้ายที่สุดเราต้องการตัวแปรลูปชั่วคราว แม้แต่การนำfillวิธีไปใช้ก็ยังสร้างตัวแปรชั่วคราวภายในซึ่งค่าจะไม่สำคัญตราบเท่าที่สร้างจำนวนที่เหมาะสมในรายการ _ดังนั้นผมจึงไม่คิดที่ไม่ได้ใช้
k0pernikus

1
@ k0pernikus ฉันจะไม่รังเกียจมันทั้งใน Scala REPL ในพื้นที่หรือในตัวอย่าง Scastie แต่ในโครงการมืออาชีพฉันคิดว่ามันมีเหตุผลเพียงพอสำหรับการปรับโครงสร้างใหม่
Alonso del Arte

1

ฉันมีคำตอบอื่นที่เลียนแบบ flatMap ที่ฉันคิด (พบว่าโซลูชันนี้ส่งคืนหน่วยเมื่อใช้ 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 คูณแต่ละองค์ประกอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.