反复迭代迭代器

时间:2018-04-13 13:33:53

标签: scala loops iterator traversal repeat

对于游戏,我需要反复迭代游戏的玩家。我想在Scala中Iterator接缝是该用例的最佳选择,因为使用迭代器it,只要你需要下一个元素就可以调用it.next(),而不是在同时。

迭代器有一个it.hasDefiniteSize和一个it.isTraversableAgain操作,表明存在无限或重复的迭代。但我在API中找不到任何关于该案例的例子。

是否有一种简单的方法可以使用迭代器或类似方法在同一个实体集合上反复遍历?

示例:

val player = Iterator(player1, player2, ...)
def doSomething(player: Iterator, condition: Boolean, something: Something): Something = {
    if (condition) something
    else {
        val nextPlayer = it.next()
        val nextCondition = someFunction()
        val somethingNew = someFunction2()
        doSomething(nextPlayer, nextCondition, somethingNew)
    }
}

我想反复迭代玩家,直到情况发生变化。

2 个答案:

答案 0 :(得分:0)

以下是迭代器的示例:

object Demo {
def main(args: Array[String]) {
  val it = Iterator("a", "number", "of", "words")

  while (it.hasNext){
     println(it.next())
  }
 }
}

答案 1 :(得分:0)

如果你坚持使用Iterator,一旦Iterator到达终点,你需要实例化一个新的迭代器或重建你的迭代器:

var it = Iterator("a", "number", "of", "words")

while(true) {
  if(it.hasNext) println(it.next())
  else it = Iterator("a", "number", "of", "words")
}

否则,您可以使用while(true)循环无限循环遍历列表:

val seq = Seq("a", "number", "of", "words")
while(true) {
  seq.foreach(println)
}

foreach内,您可以随意为玩家做任何事情。

如果你想在满足某个条件后结束游戏,你可以制作一个名为gameOver的布尔值,并将此foreach包裹在while循环中:

val seq = Seq("a", "number", "of", "words")
var gameOver = false

def takeTurn(player: String) = {
  // game logic

  // if player wins
  if(???) gameOver = true
}

while(!gameOver) {
  seq.foreach {
    player => takeTurn(player)
  }
}

......或类似的东西。