Làm thế nào để tạo một danh sách với n-lần phần tử giống nhau?


90

Làm thế nào để tạo một danh sách với n-lần phần tử giống nhau?

Triển khai thủ công:

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)

Cũng có một cách tích hợp để làm điều tương tự?

Câu trả lời:



11

Sử dụng tabulatenhư thế này,

List.tabulate(3)(_ => "foo")

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

Hoạt động như một sự quyến rũ.


@AlonsodelArte Tại sao lại lãng phí?
k0pernikus

@ k0pernikus Bởi vì giá trị của _không thực sự quan trọng. Bạn có thể làm n to 1 by -1, -1 to -n by -1v.v.
Alonso del Arte

1
@AlonsodelArte Cuối cùng, người ta cần một biến vòng lặp tạm thời. Ngay cả việc filltriển khai của phương thức này cũng tạo ra một biến tạm thời bên trong mà giá trị của nó sẽ không quan trọng miễn là nó tạo ra đúng số lượng trong danh sách. Vì vậy, tôi không bận tâm về việc không sử dụng _.
k0pernikus

1
@ k0pernikus Tôi sẽ không bận tâm về điều đó trên Scala REPL cục bộ hoặc trong một đoạn Scastie. Nhưng đối với một dự án chuyên nghiệp, tôi sẽ coi đó là lý do đủ để tái cấu trúc.
Alonso del Arte

1

Tôi có một câu trả lời khác mô phỏng flatMap mà tôi nghĩ (phát hiện ra rằng giải pháp này trả về Đơn vị khi áp dụng DupateN)

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

nhưng điều này đúng hơn cho một Danh sách xác định trước và bạn muốn nhân đôi n lần mỗi phần tử

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.