Java中的优先队列?

4

在Java中,是否可以创建一个对象的优先队列,其中决定优先级的键是对象的成员?

我在网络上看到的所有示例都将整数插入PriorityQueue并检索它们。我正在寻找一种实现方式,可以插入对象实例,并根据其某个成员值(可能是整数)进行检索。

1个回答

17

是的,PriorityQueue有一个constructor,允许您传递一个Comparator来定义元素的顺序。例如,如果您有以下Bar类:

public class Bar {
  private int priority;

  // getters / setters ...
}

如果您想创建一个优先级队列,以priority字段为依据对元素进行排序(例如,具有更高优先级的项目留在队列前面),可以使用以下代码:
Queue<Bar> queue = new PriorityQueue<Bar>(new Comparator<Bar>() {
  public int compare(Bar a1, Bar a2) {
    return a2.getPriority() - a1.getPriority(); // adapt this to your needs
  }
});

如果你在比较方法中有更复杂的逻辑,或者想要重复使用代码,那么我建议你创建一个类,例如BarComparator,实现Comparator<Bar>接口。

另外,作为上述方法的替代方案,你可以让Bar实现Comparable接口,并使用empty构造函数,像这样:

public class Bar implements Comparable<Bar> {
  private int priority;

  @Override
  public int compareTo(Bar b) {
    return b.getPriority() - this.priority;
  }
}

希望有所帮助。

当您说按更高优先级排序时,是指具有优先级3的酒吧比具有优先级13的酒吧具有更高的优先级,还是指具有较小优先级值的酒吧实际上具有“更高的优先级”? - Tomek
1
正好相反。优先级为20的“Bar a”比优先级为18的“Bar b”具有更高的优先级,因此,“Bar a”保持在队列的前面。 - João Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接