Yes, PriorityQueue
has a constructor that allows you to a pass a Comparator
to define the order of the elements. For example, if you have the following Bar
class:
public class Bar {
private int priority;
// getters / setters ...
}
And you want to create a priority queue that orders the elements based on the priority
field (e.g., items with greater priority stay in the front of the queue), you can use the following:
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
}
});
If you have more complex logic in the compare
method, or if you want to reutilize the code, then I suggest you create a class, say BarComparator
, that implements Comparator<Bar>
.
Also, as an alternative to the above, you can make Bar
implement the Comparable
interface, and use the empty constructor, like so:
public class Bar implements Comparable<Bar> {
private int priority;
@Override
public int compareTo(Bar b) {
return b.getPriority() - this.priority;
}
}
Hope it helps.