首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala集合中是否提供循环调度/循环队列

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

Stack Overflow用户
提问于 2013-11-05 00:12:51
回答 4查看 6.7K关注 0票数 23

Scala集合中是否提供了循环调度队列?

我需要重复迭代一个循环通过自身的列表。

代码语言:javascript
运行
复制
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)

..。诸若此类

EN

回答 4

Stack Overflow用户

发布于 2013-11-05 00:32:05

使用continuallyflatten创建自己的应用程序非常容易

代码语言:javascript
运行
复制
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

Stream上还有一个continually方法,如果你要生成很多元素,要小心不要引用到流的头部。

票数 50
EN

Stack Overflow用户

发布于 2013-11-05 00:29:04

您可以很容易地使用Stream创建循环列表。

代码语言:javascript
运行
复制
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中的结构共享)。如下所示:

代码语言:javascript
运行
复制
def circular[A](a: Seq[A]): Stream[A] = {
  val repeat = a.toStream
  def b: Stream[A] = repeat #::: b
  b
}
票数 12
EN

Stack Overflow用户

发布于 2015-06-26 19:35:27

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

代码语言:javascript
运行
复制
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?

在你的问题中,你可以像这样使用它:

代码语言:javascript
运行
复制
for(i <- 1 to 10) yield getNext()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19771992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档