2012-04-05 62 views
6

我想知道如何以最佳功能方式使用隊列。例如,我想將元素出列並用遞歸函數打印出來。 我想要最美的功能。使用scala不可變隊列的最佳實踐隊列

例如,這是一個做我想做的功能。但我不喜歡如果。

他們是使用隊列的更好方法嗎?

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)) 

感謝您的回覆。

回答

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

除隊列不按順序迭代。無論如何,他們並不一定如此。 – 2012-04-05 13:40:30

+0

@ DanielC.Sobral - 授予; order-sameness是'immutable.Queue'的一個未記錄的特徵。 – 2012-04-05 13:48:23

+0

'!p.isEmpty'可以替換爲'p.nonEmpty'。它更加優雅;) – metch 2014-11-19 10:51:36

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