如何创建具有相同元素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)
还有内置的方法可以做到这一点吗?
Answers:
见scala.collection.generic.SeqFactory.fill(正的:int)(ELEM:=> A)该集合的数据结构,例如Seq
,Stream
,Iterator
等等,延伸:
scala> List.fill(3)("foo")
res1: List[String] = List(foo, foo, foo)
警告它在Scala 2.7中不可用。
(1 to n).map( _ => "foo" )
奇迹般有效。
_
实际上并不重要。你可以做n to 1 by -1
,-1 to -n by -1
等
fill
方法的实现都在内部构造了一个临时变量,只要它在列表中产生正确的数量,其值就无关紧要。所以我不在乎未使用的 _
。
我还有一个模拟我认为的flatMap的答案(发现该解决方案在应用重复N时返回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次