我想使用immutable.Queue
,特别是:
我想访问队列的头部而不弹出它。不可变队列是使用两个不可变列表/堆栈实现的,从代码中看,这个操作似乎不是常数时间(请参见这行代码),尽管弹出是(平摊常数时间)。有人能确认或纠正我吗?
我喜欢
List
的模式匹配语法(例如,list match { case head :: tail => ... }
)。我们是否也有类似于Queue
的东西?
您可以在Seq
上使用通用匹配器+:
:
val q = Queue.empty[Int]
q match {
case x +: xs => // non-empty case
case _ => // empty case
}
您也可以使用Queue
的unapplySeq
:
q match {
case Queue(x, _*) => // non-empty case
case Queue() => // empty case
}
请注意,这两种方法可能比 Queue.head
更加低效,因为它们必须构造已出队列的队列,而该构造过程仅在摊销时间中为 O(1)
。
+:
的指针。我看到它来自于SeqExtractors
类。 - user716468Queue.head
真的是O(1)
吗?我修改了我的问题,包括源代码的链接。 - user716468in
列表。像这样的不可变的 dequeue 在摊销 O(1) 的时间内实现,因为你正好对每个元素进行了enqueue
和dequeue
(这也并不一定正确,可以通过dequeue
并且舍弃结果队列来实现)。由于你可以多次执行head
,所以你询问的特定head
可能不会被摊销。 - gzm0Queue.head
是摊销的O(1)
有点不正确。您能修正一下吗?谢谢! - user716468