Scala集合中是否提供循环/循环队列

时间:2013-11-04 16:12:51

标签: scala scala-collections scala-2.10

Scala集合中是否有可用的循环队列?

我需要反复迭代一个循环自己的列表

val x = new CircularList(1,2,3,4)
x.next (returns 1)
x.next (returns 2)
x.next (returns 3)
x.next (returns 4)
x.next (returns 1)
x.next (returns 2)
x.next (returns 3)

......等等

4 个答案:

答案 0 :(得分:38)

使用continuallyflatten

轻松推出自己的广告
scala> val circular = Iterator.continually(List(1, 2, 3, 4)).flatten
circular: Iterator[Int] = non-empty iterator

scala> circular.take(17).mkString(" ")
res0: String = 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4

continually上还有一个Stream方法 - 如果要生成大量元素,请注意不要保留对流的头部的引用。

答案 1 :(得分:12)

您可以使用Stream轻松创建循环列表。

scala> val l = List(1,2,3,4).toStream
l: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> def b: Stream[Int] = l #::: b
b: Stream[Int]

scala> b.take(20).toList
res2: List[Int] = List(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4)

编辑:您希望确保预先定义重复的部分,一次且仅一次,以避免炸堆(Stream中的结构共享)。如:

def circular[A](a: Seq[A]): Stream[A] = {
  val repeat = a.toStream
  def b: Stream[A] = repeat #::: b
  b
}

答案 2 :(得分:1)

版本更专注于在每次执行时获取新元素。

java.lang.UnsatisfiedLinkError: Couldn't load Plumble from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/mnt/asec/com.morlunk.mumbleclient-1/pkg.apk"],nativeLibraryDirectories=[/mnt/asec/com.morlunk.mumbleclient-1/lib, /vendor/lib, /system/lib, /system/lib/arm]]]: findLibrary returned null

在您的问题中,您可以使用它:

val getNext: () => Int = {
  def b: Stream[Int] = List(1, 2, 3, 4).toStream #::: b
  var cyclicIterator: Stream[Int] = b
  () => {
    val tail = cyclicIterator.tail
    val result = tail.head
    cyclicIterator = tail
    result 
  }
} // could be written more sexy?

答案 3 :(得分:0)

这有一个外部可变索引是丑陋的,但它确实做了所要求的:

scala> var i = 0
scala> val ic4 = Iterator.continually { val next = IndexedSeq(1, 2, 3, 4)(i % 4); i += 1; next }
i: Int = 0
ic4: Iterator[Int] = non-empty iterator

scala> ic4 take 10 foreach { i => printf("ic4.next=%d%n", i) }
ic4.next=1
ic4.next=2
ic4.next=3
ic4.next=4
ic4.next=1
ic4.next=2
ic4.next=3
ic4.next=4
ic4.next=1
ic4.next=2

至少它说明了Iterator.continually。还有Stream.continually,它具有相同的签名。