2012-04-05 9 views
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)) 

ありがとうございます。

答えて

3

Queueはそれをやや立派になるだろうdequeueOption方法を、持っていません。しかし、あなたの試合の最初のエントリは網羅的です。 println("End")コードに到達することはできません。これは単に順番にキューを通過するので、人は常にちょうど

p.foreach(println) 

すべてをプリントアウトすることができ、もちろん

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

:だからあなたはあなたのバージョンを向上させることができます。

+1

キューがインオーダーで繰り返されることを除いて、とにかく必ずしもそうではありません。 –

+0

@ DanielC.Sobral - 付与されました。注文同一性は、「不変.Queue」の文書化されていない特徴です。 –

+0

'!p.isEmpty'は' p.nonEmpty'に置き換えることができます。それはよりエレガントです;) – metch

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 
関連する問題