Ist es möglich, Elemente aus PriorityQueue zu entfernen?Ist es möglich, Elemente aus PriorityQueue zu entfernen?
Dokumentation:
http://www.scala-lang.org/api/current/index.html#scala.collection.mutable.PriorityQueue
http://www.scala-lang.org/api/current/index.html#scala.collection.Iterator
Ich habe eine PQ w verschiedene Doppel Werte (einige Duplikate) - Ich benutze es als ein Haufen Spur von Roll Mediane in einer Streaming-Umgebung zu halten. Ich möchte Werte aus PQ entfernen, kann aber nicht herausfinden, wie.
Ich habe versucht, den Iterator zu verwenden, um ein Element der PQ zu finden und dort zu fallen, aber es hat nicht funktioniert. Ich frage mich, ob es überhaupt möglich ist?
val maxHeapLeft= new mutable.PriorityQueue[Double]()(Ordering[Double])
maxHeapLeft.enqueue(5)
maxHeapLeft.enqueue(55)
maxHeapLeft.enqueue(25)
maxHeapLeft.enqueue(15)
maxHeapLeft.enqueue(15)
val it= maxHeapLeft.iterator
var p1=it.next
p1=it.next
println("size before " +maxHeapLeft.size)
it.drop(1)
println("size AFTER " +maxHeapLeft.size)
Die Größe von PQ ändert sich nicht.
EDIT 1: Bis jetzt verwende ich maxHeapLeft= new mutable.PriorityQueue[Double]()(Ordering[Double]) ++ (maxHeapLeft.toList diff List(15))
, um 15 aus dem PQ zu entfernen. Natürlich, schrecklich.
EDIT 2: Ein Testfall (für @Nate), die für die individuelle Prioritätswarteschlange fehlschlägt:
"PQ" should "produce correct values " in {
val testOperations = List[String]("8114.0", "9233.0", "dequeue", "10176.0", "10136.0", "dequeue", "10041.0", "9900.0", "10787.0", "10476.0", "10439.0", "dequeue", "10722.0", "9900.0", "11028.0", "10764.0", "dequeue", "10698.0", "10374.0", "dequeue", "-10176.0", "10198.0", "-10136.0", "11478.0", "10930.0", "dequeue", "10881.0", "dequeue", "10555.0", "dequeue", "-10787.0", "10439.0", "-10476.0", "11596.0", "-10439.0", "10757.0", "-10722.0", "10493.0", "10551.0", "dequeue", "-11028.0", "10493.0", "-10764.0", "11892.0", "-10698.0", "11276.0", "10917.0", "dequeue", "15855.0", "dequeue", "12008.0", "dequeue")
val customPQ= new PriorityQueue[Double]()(Ordering[Double].reverse) //cread min heap
for (el <-testOperations){
el match {
case dequeue if el=="dequeue" => customPQ.dequeue()
case remove if remove.toDouble < 0 => customPQ -= (-1*remove.toDouble)
case add => customPQ.enqueue(add.toDouble)
}
}
println(customPQ.head + "==" + customPQ.min)
println(customPQ)
}
Testausgang:
10881,0 10757,0 ==
Priorityqueue (10881,0, 10917,0 , 11596.0, 10930.0, 11276.0, 11892.0, 12008.0, 11478.0, 10757.0, 15855.0)
Die Drop-Methode des Iterators entfernt das Element nicht, sondern verschiebt den Iterator nur vorwärts. Können Sie bitte sagen, wie Sie ein Element entfernen möchten? Wenn Sie nur einen bestimmten Wert entfernen möchten, können Sie einfach den Filter verwenden. Wenn Sie einen bestimmten Index entfernen möchten, können Sie möglicherweise eine Kombination aus Take- und Drop-Methoden verwenden. – mohit
@mohit Ich habe Duplikate, also würde ein Filter alle entfernen, was ich nicht will. Ich möchte Heap-Verhalten und die Möglichkeit, ein Element auch nach Wert zu entfernen (und erneut zu ernennen) – Adrian
Ich aktualisierte meine Antwort, um den entsprechenden Code enthalten, um PQ auf eigene Faust zu ändern. – Nate