我认为处理队列是最常见的情况。我将读取队列的开头,对元素进行操作(这可能导致将更多元素添加到队列中),然后循环直到队列为空。

  • 我的第一个本能是foreach,但是没有,显然一个队列(甚至是一个可变的队列)是严格的,并且在迭代开始时foreach循环遍历队列中的所有元素。
  • 我无法弄清楚while循环的语法。

  • 您可能会以为
    while (!q.isEmpty) {
       var (e, q) = q.dequeue
       ... }
    

    除了我要重新声明q之外,将可以使用。这确实有效:
    while (!q.isEmpty) {
       var (e, q1) = q.dequeue
       q = q1
       ... }
    

    但是男人,这看起来不对吗...

    最佳答案

    这是一种完全避免使用任何var的方法:

    val q0 = collection.immutable.Queue("1","Two","iii")
    Iterator.iterate(q0) { qi =>
      val (e,q) = qi.dequeue
      println("I just dequeued "+e)  // Your side-effecting operations go here
      if (e.length!=2) q.enqueue("..")  // Your changes to the queue go here
      else q
    }.takeWhile(! _.isEmpty).foreach(identity)
    

    首先从初始队列q0开始,然后在qi步骤中,使某些内容出队并生成新队列(如果需要),然后将其返回下一步。

    剩下的就是停止条件(不为空),然后由于这仅定义了一个过程,而不是实际的 Action ,因此您必须运行它(例如,使用无操作foreach)。

    10-07 19:29
    查看更多