我想以增量方式迭代一个scala列表,即第一个传递应该产生头,第二个传递前2个元素,下一个传递3个等等......
我可以将自己编码为递归函数,但是在标准库中是否存在预先存在的函数?
答案 0 :(得分:6)
你可以使用.inits
方法来实现这一目标,虽然可能存在大型列表的性能问题(我还没有玩过这种方法):
scala> val data = List(0,1,2,3,4)
data: List[Int] = List(0, 1, 2, 3, 4)
scala> data.inits.toList.reverse.flatten
res2: List[Int] = List(0, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4)
答案 1 :(得分:3)
您可以像take
那样使用:
scala> val myList = 1 to 10 toList
myList: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> for(cnt <- myList.indices) yield myList.take(cnt+1)
res1: scala.collection.immutable.IndexedSeq[List[Int]] = Vector(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4), List(1, 2, 3, 4, 5), List(1, 2, 3, 4, 5, 6), List(1, 2, 3, 4, 5, 6, 7), List(1, 2, 3, 4, 5, 6, 7, 8), List(1, 2, 3, 4, 5, 6, 7, 8, 9), List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
答案 2 :(得分:1)
好的,因为我已经抱怨了,这里有一个迭代器版本,它试图在一点上不浪费空间或计算超出需要的空间:
class stini[A](xs: List[A]) extends Iterator[List[A]] {
var ys: List[A] = Nil
var remaining = xs
def hasNext = remaining.nonEmpty
def next = {
val e = remaining.head
remaining = remaining.tail
ys = e :: ys
ys.reverse
}
}
val it = new stini(List(1, 2, 3, 4))
it.toList
//> List[List[Int]] =
// List(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4))
答案 3 :(得分:0)
尝试:for((x, i) <- l.view.zipWithIndex) println(l.take(i + 1))
如果你需要一些副作用(我只是println
给你一个例子)