Scala不可变队列的最佳实践

6

我希望了解如何以最佳的功能方式使用队列。例如,我想使用递归函数出队元素并将它们打印出来。我希望这个函数是最好的。

例如,这是一个实现我所需功能的函数。但我不喜欢if语句。

有没有更好的方法来使用队列?

import scala.collection.immutable.Queue

def printQ[A](p:Queue[A]) {
  if(!p.isEmpty) {
    p.dequeue match { 
      case (x,xs) => 
        println(x.toString) 
        printQ(xs) 
      case _ => 
        println("End")    
    }
  }    
}

printQ(Queue(1,2,4,5))

感谢回复。
2个回答

3

Queue没有dequeueOption方法,这使它有点不太方便。但是请注意,您的匹配中的第一个条目是穷尽的;您永远无法到达println("End")代码。所以,您可以改进您的版本:

def printQ[A](p: Queue[A]) {
  if (!p.isEmpty) p.dequeue match {
    case (x,xs) =>
      println(x.toString)
      printQ(xs)
  }
}

当然,由于这只是按顺序遍历队列,因此可以随时只需执行此操作。
p.foreach(println)

打印所有内容。


1
除了队列不按顺序迭代。 或者它们不一定这样做。 - Daniel C. Sobral
@DanielC.Sobral - 确实,order-sameness 是 immutable.Queue 的一个未记录特性。 - Rex Kerr
!p.isEmpty 可以被替换为 p.nonEmpty。这样更加优雅 ;) - metch

2

You don't need to test for case _:

scala> @annotation.tailrec def printQ[A](p:Queue[A]) {
     |   if(!p.isEmpty) {
     |     p.dequeue match {
     |       case (x,xs) =>
     |         println(x.toString)
     |         printQ(xs)
     |     }
     |   }
     | }
printQ: [A](p: scala.collection.immutable.Queue[A])Unit

scala> printQ(Queue(1,2,4,5))
1
2
4
5

函数必须递归吗?
scala> for (i <- Queue(1, 2, 4, 5)) println(i)
1
2
4
5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接