From cf76ffdc984fada938e4a08a4c947eafd9c1c033 Mon Sep 17 00:00:00 2001 From: Renan Pimentel Date: Tue, 6 Oct 2026 10:16:30 -0300 Subject: [PATCH] fix(priority-queue): remove() should match items by value, not by priority PriorityQueue.remove(item) was called without a finding comparator, so Heap.remove fell back to this.compare, which compares priorities. As a result, removing one item also removed every other item sharing its priority: pq.add('a', 1); pq.add('b', 1); pq.remove('a'); // 'b' is gone too Default the finding comparator to value comparison (the same one changePriority already uses) and add a regression test. --- .../priority-queue/PriorityQueue.js | 2 +- .../priority-queue/__test__/PriorityQueue.test.js | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/data-structures/priority-queue/PriorityQueue.js b/src/data-structures/priority-queue/PriorityQueue.js index 0b283c2c7a..acb8a213a0 100644 --- a/src/data-structures/priority-queue/PriorityQueue.js +++ b/src/data-structures/priority-queue/PriorityQueue.js @@ -34,7 +34,7 @@ export default class PriorityQueue extends MinHeap { * @param {Comparator} [customFindingComparator] - custom function for finding the item to remove * @return {PriorityQueue} */ - remove(item, customFindingComparator) { + remove(item, customFindingComparator = new Comparator(this.compareValue)) { super.remove(item, customFindingComparator); this.priorities.delete(item); return this; diff --git a/src/data-structures/priority-queue/__test__/PriorityQueue.test.js b/src/data-structures/priority-queue/__test__/PriorityQueue.test.js index 2ffe4acb74..e19a1e6510 100644 --- a/src/data-structures/priority-queue/__test__/PriorityQueue.test.js +++ b/src/data-structures/priority-queue/__test__/PriorityQueue.test.js @@ -121,4 +121,19 @@ describe('PriorityQueue', () => { expect(priorityQueue.hasValue(70)).toBe(false); expect(priorityQueue.hasValue(15)).toBe(true); }); + it('should remove only the given item and keep items with the same priority', () => { + const priorityQueue = new PriorityQueue(); + + priorityQueue.add(10, 1); + priorityQueue.add(5, 1); + priorityQueue.add(100, 2); + + priorityQueue.remove(10); + + expect(priorityQueue.hasValue(10)).toBe(false); + expect(priorityQueue.hasValue(5)).toBe(true); + expect(priorityQueue.poll()).toBe(5); + expect(priorityQueue.poll()).toBe(100); + expect(priorityQueue.isEmpty()).toBe(true); + }); });