2010-07-15 99 views
12

我需要遍历列表,但循环的方式。我还需要在列表中添加新元素并遍历所有元素(旧的和新闻元素),我该怎么做?他们有没有数据结构?迭代循环方式

回答

7

我想也许这就是你想要的;即使您正在迭代它,也可以将新元素添加到列表中。代码是丑陋的,但它似乎工作。

import scala.collection.mutable.Queue 

class Circular[A](list: Seq[A]) extends Iterator[A]{ 

    val elements = new Queue[A] ++= list 
    var pos = 0 

    def next = { 
    if (pos == elements.length) 
     pos = 0 
    val value = elements(pos) 
    pos = pos + 1 
    value 
    } 

    def hasNext = !elements.isEmpty 
    def add(a: A): Unit = { elements += a } 
    override def toString = elements.toString 

} 

您可以使用它像这样:

scala> var circ = new Circular(List(1,2)) 
res26: Circular[Int] = Queue(1,2) 
scala> circ.next 
res27: Int = 1 
scala> circ.next 
res28: Int = 2 
scala> circ.next 
res29: Int = 1 
scala> circ.add(5) 
scala> circ.next 
res30: Int = 2 
scala> circ.next 
res31: Int = 5 
scala> circ 
res32: Circular[Int] = Queue(1,2,5) 
17

一种选择是使用Stream类来创建一个懒惰的,圆形的,无限序列:

scala> val values = List(1, 2, 3) 
values: List[Int] = List(1, 2, 3) 

scala> Stream.continually(values.toStream).flatten.take(9).toList 
res2: List[Int] = List(1, 2, 3, 1, 2, 3, 1, 2, 3) 

或者这样说:

val values = List(1, 2, 3) 

def circularStream(values: List[Int], 
        remaining: List[Int] = List()): Stream[Int] = { 

    if (remaining.isEmpty) 
    circularStream(values,values) 
    else 
    Stream.cons(remaining.head, circularStream(values, remaining.drop(1))) 
} 

circularStream(values).take(9).toList //Same result as example #1 
+6

您的视频流是无限的,但它们不是圆形。为了使它们循环,你需要一个像'def circular [T](xs:Stream [T])这样的技巧:Stream [T] = {lazy val knot:Stream [T] = xs#::: knot;结'} – 2012-12-21 13:24:28

7

这种事情真不愧是标准流库,但似乎不是。 dbryne与流回答运作良好,或者如果您在-理解的形式

val listToRepeat:List[Foo] 
val forever:Stream[Foo] = for(x<-Stream.continually(1); y<-listToRepeat) yield y 

喜欢它的第一个流发生器让事情会永远即使你忽略的价值。第二个生成器隐式平坦化为所需的无限流。

+1

你不需要'Stream.continually()'的参数,我认为使用'Stream [Unit]'看起来不像'Stream [Int]'那么混乱。 – Debilski 2010-07-15 23:31:12

10
def forever:Stream[Int] = Stream(1,2,3) append forever 
+2

注意这是无限的,但不是圆形的。 – 2012-12-21 13:25:05