Java PriorityQueue with Comparator
December 21, 2022
On this page, we will learn to use java.util.PriorityQueue
with specified Comparator
in our Java application.
1. The
PriorityQueue
is an unbounded queue based on a priority heap. The PriorityQueue
has a default initial capacity or we can specify its initial capacity. As elements are added to a priority queue, its capacity grows automatically.
2. The elements of the
PriorityQueue
are ordered according to their natural ordering or by Comparator
specified to the constructor at creation time. The PriorityQueue
that depends on natural ordering, does not permit insertion of non-comparable objects.
Constructors with Comparator
Find the constructors ofPriorityQueue
with Comparator
arguments.
1.
public PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
PriorityQueue
using specified initial capacity and the comparator to order the elements. If comparator is null, elements will be ordered in natural order.
Parameters:
The initialCapacity is the initial capacity for this priority queue.
The comparator is the comparator that will be used to order this priority queue.
Throws:
If initial capacity is less than 1, IllegalArgumentException is thrown.
2.
public PriorityQueue(Comparator<? super E> comparator)
PriorityQueue
using default initial capacity and the specified comparator to order the elements. If comparator is null, elements will be ordered in natural order.
Parameters:
The initialCapacity is the initial capacity for this priority queue.
Using Comparator as Lambda Expression
PriorityQueueOne.javapackage com.concretepage; import java.io.IOException; import java.util.Comparator; import java.util.PriorityQueue; public class PriorityQueueOne { public static void main(String... args) throws Exception, IOException { Comparator<Person> nameComparator = Comparator.comparing(Person::getName); PriorityQueue<Person> pq = new PriorityQueue<>(nameComparator); Person p1 = new Person("Mohan", 25); Person p2 = new Person("Krishn", 30); Person p3 = new Person("Abhay", 32); pq.add(p1); pq.add(p2); pq.add(p3); System.out.println(pq); } }
package com.concretepage; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name + " - " + age; } }
[Abhay - 32, Mohan - 25, Krishn - 30]
Using Comparator Class
PriorityQueueTwo.javapackage com.concretepage; import java.io.IOException; import java.io.Serializable; import java.util.Comparator; import java.util.PriorityQueue; public class PriorityQueueTwo { public static void main(String... args) throws Exception, IOException { NameComparator nameComparator = new NameComparator(); PriorityQueue<Person> pq = new PriorityQueue<>(nameComparator); Person p1 = new Person("Mohan", 25); Person p2 = new Person("Krishn", 30); Person p3 = new Person("Abhay", 32); pq.add(p1); pq.add(p2); pq.add(p3); System.out.println(pq); } } class NameComparator implements Comparator<Person>, Serializable { private static final long serialVersionUID = 1L; @Override public int compare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } }
[Abhay - 32, Mohan - 25, Krishn - 30]
With Natural Ordering
ThePriorityQueue
constructors without Comparator
, are ordered according to their natural ordering. Find the example of PriorityQueue
that depends on natural ordering.
PriorityQueue<String> pq = new PriorityQueue<>(); pq.add("Mohan"); pq.add("Krishn"); pq.add("Abhay"); System.out.println(pq);
[Abhay, Mohan, Krishn]
ClassCastException
.
PriorityQueue<Person> pq = new PriorityQueue<>(); Person p1 = new Person("Mohan", 25); Person p2 = new Person("Krishn", 30); Person p3 = new Person("Abhay", 32); pq.add(p1); pq.add(p2); pq.add(p3);
Exception in thread "main" java.lang.ClassCastException