使用scala immutable Queue的最佳实践

时间:2012-04-05 10:46:02

标签: scala queue

我想知道如何以最佳功能方式使用Queue。 例如,我想将元素出列并使用递归函数打印它们。 我想要最美丽的功能。

例如,这是一个按我想要的功能。但我不喜欢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 个答案:

答案 0 :(得分: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 :(得分:2)

您无需测试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