当前位置: 首页 > 知识库问答 >
问题:

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

殳睿
2023-03-14

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

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

这几乎完成了我需要它做的所有事情,除了它在我插入(或移除)键值对时不保持它们的顺序。

编辑:

感谢你在第一条评论中提出的好问题。我所说的FIFO是指对于具有相等值的键值对,首先放入的键值对应该首先被提取。

共有1个答案

沙柏
2023-03-14

你需要这样的东西:

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<String, Integer> {
    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<Entry> {
    @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<Entry> pq = new PriorityQueue<Entry>(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());
    }
  }
}
 类似资料:
  • 我一直在通过互联网进行广泛的搜索,寻找某种类型的答案来解决我的问题,但我没有运气找到任何可以帮助我的东西。基本上,我想知道的是是否可以将双精度转换为密钥,然后将其插入到优先级队列中。 这就是我正在努力使用的方法,它来自一个文件名。就是这个: 文件中的 insert 方法如下所示: 这是的插入方法.java 它们是相同的。现在问题出现了,因为来自.java不能更改。我必须接受一个双精度,然后将该双精

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。

  • 我知道我们可以使用collections.reverseOrder()创建一个使用优先级队列的max堆,但是我还需要在那个地方传递ArrayList。我试图创建一个自定义比较器以防万一,但它似乎不起作用。我想知道这样做的确切语法。 示例/我的知识: 1)创建一个空的最小堆->PriorityQueue pqmin=new PriorityQueue(); 2)从一个ArrayList创建一个最小堆

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 问题内容: Java API线程优先级(1-10)如何转换为操作系统级别的优先级,因为大多数操作系统没有与此相匹配的线程优先级别(就数量而言)。 因此请记住,在某些情况下,具有不同优先级的两个或多个线程最终会在OS级别获得相同的优先级。 如果我的理解有需要更正,请澄清。 问题答案: 实际上,某些优先级可以映射到相同的“本地”优先级。这是列表(基于OpenJDK 6中的Hotspot代码): Sol

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。