PriorityQueue에서 요소를 제거 할 수 있습니까?PriorityQueue에서 요소를 제거 할 수 있습니까?
문서 : http://www.scala-lang.org/api/current/index.html#scala.collection.Iterator
내가 여러 번 값 (일부 중복) 승 PQ이
이 http://www.scala-lang.org/api/current/index.html#scala.collection.mutable.PriorityQueue
- 나는 스트리밍 환경에서 롤링 중간 값을 추적하기 위해 힙로 사용합니다. PQ에서 값을 제거하고 싶지만 어떻게 계산할 수는 없습니다.
필자는 반복기를 사용하여 PQ의 요소를 찾고 거기에 드롭하려고했지만 작동하지 않았습니다. 가능한지 궁금해?
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)
PQ의 크기는 변경되지 않습니다.
EDIT 1 : 지금까지 나는 012를 PQ에서 제거하려면 maxHeapLeft= new mutable.PriorityQueue[Double]()(Ordering[Double]) ++ (maxHeapLeft.toList diff List(15))
을 사용합니다. 물론, 끔찍한.
EDIT 2 : 지정 우선 순위 큐 실패 (@Nate 용) 테스트 케이스 :
"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)
}
테스트 출력 :
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)
반복자의 놓기 방법은 요소를 제거하지 않고 반복기를 앞으로 이동시킵니다. 요소를 어떻게 제거 할 것인지 알려주시겠습니까? 특정 값을 제거하려는 경우 필터 만 사용할 수 있습니다. 특정 인덱스에서 제거하려는 경우 take 및 drop 메소드의 조합을 사용할 수 있습니다. – mohit
@mohit 필자는 필터가 모든 것을 제거 할 수 있도록 복제본을 가지고 있습니다. 힙 동작과 값으로 요소를 제거하는 기능을 원합니다. – Adrian
직접 PQ를 수정하기 위해 관련 코드를 포함하도록 답변을 업데이트했습니다. – Nate