将Java PriorityQueue转换为稳定的优先级队列

我正在尝试在Java中实现稳定(先进先出)优先级队列。 假设密钥是一个名称,值是一个年龄,我知道我可以像这样建立一个不稳定的优先级队列:

Queue<Map.Entry> pq = new PriorityQueue<Map.Entry>(100, ageComparator); 

这几乎可以满足我所需要的一切,除了它在我插入(或删除它们)时不保持键值对的顺序。

我通过创建一个LinkedList找到了“解决方法”,它实际上提供了所有相同的function,除了它不包含带比较器选项的构造函数,我觉得它必须更慢,因为我保持值排序通过在每个队列操作后调用Collections.sort()

所以我想我真的有两个选项让我感兴趣。首先,我如何编辑上面的PriorityQueue来维护插入和删除顺序? 或者,我怎样才能强制我的LinkedList选项立即使用比较器而不必在每次操作时调用排序? 谢谢!

编辑:

感谢发布的第一条评论中的好问题。 通过FIFO,我的意思是对于具有相等值的键值对,应首先提取首先放入的对。

你需要这样的东西:

 import java.util.AbstractMap; import java.util.Comparator; import java.util.PriorityQueue; import java.util.concurrent.atomic.AtomicInteger; public class PriorityTest { @SuppressWarnings("serial") private static class Entry extends AbstractMap.SimpleEntry { private final static AtomicInteger seq = new AtomicInteger(0); final int order; public Entry(final String _key, final Integer _value) { super(_key, _value); order = seq.incrementAndGet(); } } private static class OrderedComparator implements Comparator { @Override public int compare(final Entry _e1, final Entry _e2) { int r = _e1.getValue().compareTo(_e2.getValue()); if (r == 0) return Integer.compare(_e1.order, _e2.order); return r; } } public static void main(String[] args) { final PriorityQueue pq = new PriorityQueue(10, new OrderedComparator()); pq.add(new Entry("Jane", 22)); pq.add(new Entry("John", 15)); pq.add(new Entry("Bill", 45)); pq.add(new Entry("Bob", 22)); while(!pq.isEmpty()) { System.out.println(pq.remove()); } } } 

基于Keap的PriorityQueue自然稳定。 它是用Kotlin编写的,因此它可以替换Java代码java.util.PriorityQueue