Overloaded Constructors
- Explain the role of the overloaded non-default constructor of PriorityQueue.
Any implementation of PriorityQueue
must provide two constructors: a default constructor (with no argument) and a non-default one which allows a Comparator to be provided to overwrite the natural ordering of the element types.
Consider the following example!
/**
* Priority queue implemented as a binary heap.
*
* @param <T> Element type.
*/
public class BinaryHeapPriorityQueue<T extends Comparable<T>>
implements PriorityQueue<T> {
private Comparator<T> cmp;
/**
* A binary heap using the "natural" ordering of T.
*/
public BinaryHeapPriorityQueue() {
this(new DefaultComparator<>());
}
/**
* A binary heap using the given comparator for T.
*
* @param cmp Comparator to use.
*/
public BinaryHeapPriorityQueue(Comparator<T> cmp) {
this.cmp = cmp;
// TODO
}
@Override
public void insert(T t) {
// TODO
}
@Override
public void remove() throws EmptyException {
// TODO
}
@Override
public T best() throws EmptyException {
// TODO
return null;
}
@Override
public boolean empty() {
// TODO
return false;
}
// The default comparator uses the "natural" ordering.
private static class DefaultComparator<T extends Comparable<T>>
implements Comparator<T> {
public int compare(T t1, T t2) {
return t1.compareTo(t2);
}
}
}
Notice the use of Comparator<T>
! Java's Comparator<T>
is an interface that defines a compare(T o1, T o2)
method with two arguments that represent compared objects.
In the next sections, we will work with a contrived example to clarify how the Comparator works and how it is different from Comparable.