Scala:任何预定义函数迭代列表(0),然后列出(0,1),然后列出(0,1,2)等?

时间:2015-11-13 11:17:19

标签: scala

我想以增量方式迭代一个scala列表,即第一个传递应该产生头,第二个传递前2个元素,下一个传递3个等等......

我可以将自己编码为递归函数,但是在标准库中是否存在预先存在的函数?

4 个答案:

答案 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给你一个例子)