Java 8 решение
Мы можем использовать lambda expression
или method reference
, представленные в Java 8. В случае, если в Приоритетной очереди хранятся некоторые значения String (емкостью 5), мы можем предоставить встроенный компаратор (на основе длины String):
Использование лямбда-выражения
PriorityQueue<String> pq=
new PriorityQueue<String>(5,(a,b) -> a.length() - b.length());
Использование ссылки на метод
PriorityQueue<String> pq=
new PriorityQueue<String>(5, Comparator.comparing(String::length));
Тогда мы можем использовать любой из них как:
public static void main(String[] args) {
PriorityQueue<String> pq=
new PriorityQueue<String>(5, (a,b) -> a.length() - b.length());
// or pq = new PriorityQueue<String>(5, Comparator.comparing(String::length));
pq.add("Apple");
pq.add("PineApple");
pq.add("Custard Apple");
while (pq.size() != 0)
{
System.out.println(pq.remove());
}
}
Будет напечатано:
Apple
PineApple
Custard Apple
Чтобы изменить порядок (изменить его на очередь с максимальным приоритетом), просто измените порядок в встроенном компараторе или используйте reversed
как:
PriorityQueue<String> pq = new PriorityQueue<String>(5,
Comparator.comparing(String::length).reversed());
Мы также можем использовать Collections.reverseOrder
:
PriorityQueue<Integer> pqInt = new PriorityQueue<>(10, Collections.reverseOrder());
PriorityQueue<String> pq = new PriorityQueue<String>(5,
Collections.reverseOrder(Comparator.comparing(String::length))
Итак, мы видим, что Collections.reverseOrder
перегружен, чтобы взять компаратор, который может быть полезен для пользовательских объектов. reversed
фактически использует Collections.reverseOrder
:
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
предложение () против добавления ()
Согласно документ
Метод offer вставляет элемент, если возможно, в противном случае возвращает
ложный. Это отличается от метода Collection.add, который может не
добавить элемент только, выбрасывая непроверенное исключение. Предложение
Метод предназначен для использования, когда отказ является нормальным, а не
исключительный случай, например, в фиксированной емкости (или «ограниченный»)
Очереди.
При использовании очереди с ограниченной емкостью, предложение (), как правило, предпочтительнее, чем add (), который может не вставить элемент, только вызвав исключение. И PriorityQueue является неограниченной приоритетной очередью, основанной на куче приоритетов.