2016-06-09 19 views
0

Gibt es eine Möglichkeit, alle Elemente in einer Scala-Prioritätswarteschlange mit einem Wert unter einem angegebenen Wert zu entfernen?Entfernen Sie alle Elemente in PriorityQueue mit einem Wert unter x

z.

val queue = scala.collection.mutable.PriorityQueue[Int]() 
queue.enqueue(3) 
queue.enqueue(5) 
queue.enqueue(10) 
queue.enqueue(8) 
queue.removeAllLessThan(6) 
println(queue) // PriorityQueue(10, 8) 

Ich weiß, dass Sie dies mit Hilfe eines Filters tun könnten, aber es scheint, als gäbe es eine sehr effiziente Art und Weise, dies zu tun auf einem Haufen wäre.

Der Grund, warum ich dies tun möchte, ist, den Speicherbedarf für einen A * -Algorithmus niedrig zu halten.

+1

Wenn Sie alle Elemente entfernen, die kleiner als ein bestimmter Wert sind, müssen Sie den Heap neu erstellen. Ich nehme an, dass die Verwendung eines Filters auch den Heap durchsuchen würde, um unerwünschte Elemente zu entfernen, und dann den Heap neu erstellen. Ich würde also erwarten, dass der Filter einigermaßen effizient ist. – user3386109

Antwort

1

In PriorityQueue wird die Reihenfolge beim Einfügen übernommen, dh ein neues Element wird in die Position eingefügt, in der die Bestellung garantiert ist. In diesem Fall unter Verwendung der Standardreihenfolge auf Int (größer als),

queue.takeWhile(_ > 6) 

iteriert über die Warteschlange, während das Prädikat enthält, im Gegensatz zu dem Filter, der jedes einzelne Element mustert.