我需要遍历列表,但循环的方式。我还需要在列表中添加新元素并遍历所有元素(旧的和新闻元素),我该怎么做?他们有没有数据结构?迭代循环方式
Q
迭代循环方式
12
A
回答
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
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
相关问题
- 1. 迭代循环
- 2. ansible迭代循环
- 3. PHP迭代循环
- 4. Android:循环迭代
- 5. Matlab:迭代循环
- 6. 迭代foreach循环
- 7. 迭代for循环
- 8. Jquery:循环迭代
- 9. VBA迭代循环
- 10. 迭代与循环
- 11. Mips循环迭代
- 12. RmarkDown迭代循环
- 13. 迭代器模式 - 循环引用
- 14. 使用而循环使用迭代式
- 15. 循环迭代函数x次循环
- 16. Excel迭代循环VBA
- 17. for循环递归迭代
- 18. For循环不迭代
- 19. 表达循环迭代正
- 20. Underscore.js模板循环迭代
- 21. 循环迭代分析
- 22. 重复循环迭代
- 23. 循环索引在迭代
- 24. Dockerfile中的循环/迭代
- 25. PowerShell的循环迭代
- 26. 显示循环迭代
- 27. 循环第一次迭代
- 28. 迭代使用-的循环
- 29. 矢量化迭代循环
- 30. 优化迭代循环
您的视频流是无限的,但它们不是圆形。为了使它们循环,你需要一个像'def circular [T](xs:Stream [T])这样的技巧:Stream [T] = {lazy val knot:Stream [T] = xs#::: knot;结'} – 2012-12-21 13:24:28