2017-11-03 2 views
1

Ich habe eine Warteschlange von List [Beliebige], aber irgendwie aus der Warteschlange gibt das korrekte Ergebnis nicht zurück und es entfernt das Element auch nicht aus der Warteschlange. Irgendeine Idee, warum das passiert ist? HierScala - Dequeue gibt kein korrektes Ergebnis zurück

ein Beispiel:

scala> val a = scala.collection.immutable.Queue(List(1, "A", "B", 987), List(2, "C", "D", 456), List(3, "E", "F", 123)) 
a: scala.collection.immutable.Queue[List[Any]] = Queue(List(1, A, B, 987), List(2, C, D, 456), List(3, E, F, 123)) 

scala> a.dequeue 
res5: (List[Any], scala.collection.immutable.Queue[List[Any]]) = (List(1, A, B, 987),Queue(List(2, C, D, 456), List(3, E, F, 123))) 

scala> a 
res6: scala.collection.immutable.Queue[List[Any]] = Queue(List(1, A, B, 987), List(2, C, D, 456), List(3, E, F, 123)) 
+2

'val (Elem, newQ) = oldQ.dequeue' – jwvh

Antwort

4

Sie eine unveränderliche Warteschlange verwendet, so dequeue nicht die ursprüngliche Warteschlange nicht verändert, sondern gibt eine modifizierte ein zusammen mit dem Kopfelement als Tupel:

val (elem, newQ) = oldQ.dequeue 

Beispielsweise können Sie die Tail-Warteschlange in einen rekursiven Aufruf zur Verarbeitung einspeisen. Etwas wie folgt aus:

def pq(q: Queue[List[Any]]): Unit = { 
    q.dequeue match { 
    case (head, tail) => 
     println(head + "..."); // ... process head element ... 
     if (tail.nonEmpty) pq(tail) 
    } 
} 
+0

dann, was ist der Zweck der unveränderlichen Warteschlange, wenn man nicht von ihm aus der Warteschlange entfernt könnte? Ich habe in Scala gehört, dass es eine gute Übung ist, einen unveränderlichen Typ zu verwenden. – Algorithman

+1

Ja ist es. Sie erhalten die modifizierte Queue als Rückgabewert, so dass Sie das verwenden können ... – Ossip

+0

können Sie ein Beispiel in Ihrer Antwort geben? – Algorithman

Verwandte Themen