2017-11-03 20 views
1

私はリスト[Any]のキューを持っていますが、何とかデキューしても正しい結果が返されず、キューからアイテムが削除されません。なぜこれが起こったのか?ここスカラ - デキューが正しい結果を返しません

は一例であり:

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

'ヴァル(elemは、newQ)= oldQ.dequeue' – jwvh

答えて

4

あなたは不変キューを使用するので、dequeueは、元のキューを変更しない、むしろタプルとしてヘッド素子と共に変性いずれかを返す:

val (elem, newQ) = oldQ.dequeue 

たとえば、処理のためにテールキューを再帰呼び出しに供給することができます。このような何か:

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

、その後1はそれからデキューできなかった場合は不変キューの目的は何ですか? Scalaでは、不変型を使うのが良い方法だと聞きました。 – Algorithman

+1

はい、そうです。戻り値として変更されたキューを取得するので、その値を使用することができます。 – Ossip

+0

答えに例を挙げることはできますか? – Algorithman

関連する問題