n 번 동일한 요소로 목록을 만드는 방법은 무엇입니까?


91

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)

동일한 작업을 수행하는 기본 제공 방법도 있습니까?

답변:




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 스 니펫에서 신경 쓰지 않을 것입니다. 그러나 전문적인 프로젝트에서는 리팩토링을위한 충분한 이유가 있다고 생각합니다.
Alonso del Arte

1

내가 생각하는 flatMap을 에뮬레이트하는 또 다른 답변이 있습니다 (이 솔루션은 duplicateN을 적용 할 때 Unit을 반환한다는 것을 알았습니다)

 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.