Java中的优先级队列

Sho*_*nna 3 java priority-queue

你有2个参数吗?例如,我想将一个字符串和一个相应的整数添加到优先级键.然后我将按整数排序.我知道如何添加字符串或整数,但我不知道如何添加它们.有人可以指出我正确的方向,让我知道我是否正确的方式?

Nam*_*ter 12

有两种方法可以做到这一点.无论哪种方式,您都希望创建一个自定义对象,该对象同时包含String(您想要的值)和整数(优先级).

第一个解决方案是让这个数据对象实现Comparable:

class Data implements Comparable<Data> {
  private final String message;
  private final int priority;

  public Data(String message, int priority) {
    this.message = message;
    this.priority = priority;
  }

  @Override
  int compareTo(Data other) {
    return Integer.valueOf(priority).compareTo(other.priority);
  }

  // also implement equals() and hashCode()
}
Run Code Online (Sandbox Code Playgroud)

然后当你这样做

PriorityQueue<Data> queue = new PriorityQueue<Data>();
Run Code Online (Sandbox Code Playgroud)

队列将按compareTo方法定义的顺序对项目进行排序.

此解决方案的问题在于,如果您希望排序仅在整数上,那么equals方法和compareTo方法将不一致或您的equals方法不正确.

更好的解决方案是使用带有ComparatorPriorityQueue构造函数.在这种情况下,不必实施; 你只需要一个定义你的订购:DataComparableComparator

public final class OrderDataByPriority implements Comparator<Data> {
  public static final OrderDataByPriority INSTANCE = new OrderDataByPriority();

  private OrderDataByPriority() {}

  @Override
  public int compare(Data data1, Data data2) {
    return Integer.valueOf(data1.priority).compareTo(data2.priority);
  }

  @Override
  public boolean equals(Object other) {
    return other == OrderDataByInteger.INSTANCE;
  }

  private Object readResolve() {
    return INSTANCE;
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,由于此比较器不采用数据,因此我将其设为单例.

然后,您可以创建以下队列行:

PriorityQueue<Data> queue = new PriorityQueue<Data>(
    initialCapacity, OrderDataByPrority.INSTANCE);
Run Code Online (Sandbox Code Playgroud)