How to Customize the Ordering of Elements in a PriorityQueue Using a Comparator in Java?
Last Updated :
15 Feb, 2024
A PriorityQueue is a data structure that allows elements to be processed based on their priority. By default, it orders elements according to their natural ordering (e.g., numeric values in ascending order). However, sometimes we need a different sorting order based on specific criteria.
In this article, we will learn to Customize the Ordering of Elements in a PriorityQueue Using a Comparator in Java.
Prerequisites:
Customize the Ordering of Elements in a PriorityQueue
Using a Custom Comparator to customize the ordering of elements in a PriorityQueue, follow these steps:
- When constructing a PriorityQueue, provide a custom comparator a define the desired order.
- The constructor PriorityQueue (int capacity, Comparator<E> comparator) allows you to create a PriorityQueue with a specified initial capacity and a custom comparator.
- The comparator determines how elements are compared and ordered.
Program to Customize the Ordering of Elements in a PriorityQueue
Let’s create a PriorityQueue of students based on their CGPA (grade point average). We’ll define a custom comparator (StudentComparator) that compares students’ CGPA values
Below is the implementation of Customize the Ordering of Elements in a PriorityQueue:
Java
import java.util.*;
public class GFG {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
PriorityQueue<Student> pq = new PriorityQueue<>( 5 , new StudentComparator());
Student student1 = new Student( "Nandini" , 3.2 );
pq.add(student1);
Student student2 = new Student( "Anmol" , 3.6 );
pq.add(student2);
Student student3 = new Student( "Palak" , 4.0 );
pq.add(student3);
System.out.println( "Students served in their priority order:" );
while (!pq.isEmpty()) {
System.out.println(pq.poll().getName());
}
}
}
class StudentComparator implements Comparator<Student> {
public int compare(Student s1, Student s2) {
if (s1.cgpa < s2.cgpa) return 1 ;
else if (s1.cgpa > s2.cgpa) return - 1 ;
return 0 ;
}
}
class Student {
public String name;
public double cgpa;
public Student(String name, double cgpa) {
this .name = name;
this .cgpa = cgpa;
}
public String getName() {
return name;
}
}
|
Output
Students served in their priority order:
Palak
Anmol
Nandini
Explanation of the above Program:
- In the example above, we create a priorityQueue of Students.
- The custom comparator (StudentComparator) orders students based on their CGPA.
- Students with higher CGPA are served first, demonstrating customized ordering.
Let’s explore another approach for customizing the ordering of elements in a PriorityQueue using a Comparator in java.
Ordering Strings by Length
Suppose we want to create a PriorityQueue that orders strings based on their length (number of characters). we’ll define a custom comparator to achieve this.Create a new Java file (e.g., StringLengthPriorityQueue.java)
Below is the implementation of Ordering Strings by Length:
Java
import java.util.*;
public class StringLengthPriorityQueue {
public static void main(String[] args) {
PriorityQueue<String> pq = new PriorityQueue<>( 5 , new StringLengthComparator());
pq.add( "apple" );
pq.add( "banana" );
pq.add( "grape" );
pq.add( "kiwi" );
System.out.println( "Strings served in order of length:" );
while (!pq.isEmpty()) {
System.out.println(pq.poll());
}
}
}
class StringLengthComparator implements Comparator<String> {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
}
|
Output
Strings served in order of length:
kiwi
apple
grape
banana
Explanation of the above Program:
- In this example, we create a PriorityQueue of Strings.
- The custom comparator ( StringLengthComparator ) compares strings based on their length.
- Strings with shorter lengths are served first.
Share your thoughts in the comments
Please Login to comment...