2012-04-05 7 views
6

Ich würde gerne wissen, wie Sie Queue in der besten funktionalen Weise verwenden. Zum Beispiel möchte ich Elemente aus der Warteschlange entfernen und sie mit einer rekursiven Funktion drucken. Und ich möchte die schönste Funktion haben.Best Practice zu verwenden Scala unveränderlich Warteschlange

Zum Beispiel ist dies eine Funktion zu tun, was ich will. Aber ich mag das Wenn nicht.

Ist eine bessere Möglichkeit, Warteschlange zu verwenden?

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

Vielen Dank für die Antworten.

Antwort

3

Queue hat kein dequeueOption Methode, die es etwas schöner machen würde. Beachten Sie jedoch, dass der erste Eintrag in Ihrem Spiel erschöpfend ist. Sie können den println("End") Code nie erreichen. So könnten Sie Ihre Version verbessern:

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

Natürlich, da diese nur die Warteschlange, um durchlaufen, kann man immer nur

p.foreach(println) 

drucken alles aus.

+1

Mit der Ausnahme, dass Warteschlangen nicht iterieren. Oder sie sind es nicht unbedingt. –

+0

@ DanielC.Sobral - Zugegeben; Die Ordnungsgleichheit ist ein undokumentiertes Merkmal von 'unveränderlich.Queue'. –

+0

'! P.isEmpty' kann durch' p.nonEmpty' ersetzt werden. Es ist eleganter;) – metch

2

Sie brauchen nicht für case _ zu testen:

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 

Ist es notwendig für die Funktion rekursiv zu sein?

scala> for (i <- Queue(1, 2, 4, 5)) println(i) 
1 
2 
4 
5