@Beta public final class MinMaxPriorityQueue<E> extends AbstractQueue<E>
As a Queue it functions exactly as a PriorityQueue: its head element -- the implicit target of the methods peek(), poll() and AbstractQueue -- is defined as the least element in the queue according to the queue's comparator. But unlike a regular priority queue, the methods peekLast(), pollLast() and removeLast() are also provided, to act on the greatest element in the queue instead.
A min-max priority queue can be configured with a maximum size. If so, each time the size of the queue exceeds that value, the queue automatically removes its greatest element according to its comparator (which might be the element that was just added). This is different from conventional bounded queues, which either block or reject new elements when full.
This implementation is based on the min-max heap developed by Atkinson, et al. Unlike many other double-ended priority queues, it stores elements in a single array, as compact as the traditional heap data structure used in PriorityQueue.
This class is not thread-safe, and does not accept null elements.
Performance notes:
peek(), peekFirst(), peekLast(), AbstractQueue.element() , and size are constant-time offer(E), add(E), and all the forms of poll() and AbstractQueue.remove() ) run in O(log n) time AbstractCollection.remove(Object) and AbstractCollection.contains(java.lang.Object) operations require linear (O(n)) time PriorityQueue, but significantly slower. | Modifier and Type | Class and Description |
|---|---|
static class |
MinMaxPriorityQueue
The builder class used in creation of min-max priority queues.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
add(E element)
Adds the given element to this queue.
|
boolean |
addAll(Collection
|
void |
clear()
|
Comparator |
comparator()
Returns the comparator used to order the elements in this queue.
|
static <E extends Comparable |
create()
Creates a new min-max priority queue with default settings: natural order, no maximum size, no initial contents, and an initial expected size of 11.
|
static <E extends Comparable |
create(Iterable
Creates a new min-max priority queue using natural order, no maximum size, and initially containing the given elements.
|
static MinMaxPriorityQueue |
expectedSize(int expectedSize)
Creates and returns a new builder, configured to build
MinMaxPriorityQueue instances sized appropriately to hold
expectedSize elements.
|
Iterator |
iterator()
Returns an iterator over the elements contained in this collection,
in no particular order.
|
static MinMaxPriorityQueue |
maximumSize(int maximumSize)
Creates and returns a new builder, configured to build
MinMaxPriorityQueue instances that are limited to
maximumSize elements.
|
boolean |
offer(E element)
Adds the given element to this queue.
|
static <B> MinMaxPriorityQueue |
orderedBy(Comparator
Creates and returns a new builder, configured to build
MinMaxPriorityQueue instances that use
comparator to determine the least and greatest elements.
|
E |
peek()
|
E |
peekFirst()
Retrieves, but does not remove, the least element of this queue, or returns
null if the queue is empty.
|
E |
peekLast()
Retrieves, but does not remove, the greatest element of this queue, or returns
null if the queue is empty.
|
E |
poll()
|
E |
pollFirst()
Removes and returns the least element of this queue, or returns
null if the queue is empty.
|
E |
pollLast()
Removes and returns the greatest element of this queue, or returns
null if the queue is empty.
|
E |
removeFirst()
Removes and returns the least element of this queue.
|
E |
removeLast()
Removes and returns the greatest element of this queue.
|
int |
size()
|
Object |
toArray()
|
element, removecontains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toStringclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitcontains, containsAll, equals, hashCode, isEmpty, parallelStream, remove, removeAll, removeIf, retainAll, spliterator, stream, toArraypublic static <E extends Comparable<E>> MinMaxPriorityQueue <E> create()
public static <E extends Comparable<E>> MinMaxPriorityQueue <E> create(Iterable <? extends E> initialContents)
public static <B> MinMaxPriorityQueue.Builder <B> orderedBy(Comparator <B> comparator)
MinMaxPriorityQueue instances that use
comparator to determine the least and greatest elements.
public static MinMaxPriorityQueue.Builder <Comparable > expectedSize(int expectedSize)
MinMaxPriorityQueue instances sized appropriately to hold
expectedSize elements.
public static MinMaxPriorityQueue.Builder <Comparable > maximumSize(int maximumSize)
MinMaxPriorityQueue instances that are limited to
maximumSize elements. Each time a queue grows beyond this bound, it immediately removes its greatest element (according to its comparator), which might be the element that was just added.
public int size()
public boolean add(E element)
element the queue will automatically evict its greatest element (according to its comparator), which may be
element itself.
add in interface
Collection<E>
add in interface
Queue<E>
add in class
AbstractQueue<E>
true always
public boolean addAll(Collection<? extends E> newElements)
public boolean offer(E element)
element the queue will automatically evict its greatest element (according to its comparator), which may be
element itself.
public E poll()
public E peek()
public E pollFirst()
null if the queue is empty.
public E removeFirst()
NoSuchElementException - if the queue is empty
public E peekFirst()
null if the queue is empty.
public E pollLast()
null if the queue is empty.
public E removeLast()
NoSuchElementException - if the queue is empty
public E peekLast()
null if the queue is empty.
public Iterator<E> iterator()
The iterator is fail-fast: If the MinMaxPriorityQueue is modified at any time after the iterator is created, in any way except through the iterator's own remove method, the iterator will generally throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.
Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.
iterator in interface
Iterable<E>
iterator in interface
Collection<E>
iterator in class
AbstractCollection<E>
public void clear()
public Object[] toArray()
public Comparator<? super E> comparator()
PriorityQueue.comparator , but returns
Ordering.natural() instead of
null to indicate natural ordering.