beginnersbook.com

  • Home
  • All Tutorials
    • Learn Servlet
    • Learn JSP
    • Learn JSTL
    • Learn C
    • Learn C++
    • Learn MongoDB
    • Learn XML
    • Learn Python
    • Learn Perl
  • Core Java
  • OOPs
  • Collections
  • Java I/O
  • JSON
  • DBMS

Comparator Interface in Java

By Chaitanya Singh | Filed Under: Java Collections

In the last tutorial, we have seen how to sort objects of a custom class using Comparable interface. By using Comparable we can sort the objects based on any data member. For example, lets say we have an Author class has data members: Author name, book name and author age, now if we want to sort the objects based on any of the data member then we can use Comparable but what if we want to have multiple sort choices and we can sort objects based on any choice, this can be done using Comparator interface, we can create as many Comparator as we want and then we can call Collections.sort on one or more Comparator like this:

//Sorting arraylist al by Author Age
Collections.sort(al, new AuthorAgeComparator());

//Sorting arraylist al by Book Name
Collections.sort(al, new BookNameComparator());

So how does it work? To call the Collections.sort method like this, we must first need to write these Comparator classes AuthorAgeComparator and BookNameComparator, along with Author class and the main class.

Complete Comparator Example

Author.java

public class Author implements Comparable<Author> {
  String firstName; 
  String bookName; 
  int auAge; 
  Author(String first, String book, int age){ 
    this.firstName = first; 
    this.bookName = book; 
    this.auAge = age; 
  } 
  public String getFirstName() { 
    return firstName; 
  }
  public void setFirstName(String firstName) { 
    this.firstName = firstName; 
  }
  public String getBookName() { 
    return bookName; 
  }
  public void setBookName(String bookName) { 
    this.bookName = bookName; 
  }
  public int getAuAge() { 
    return auAge; 
  }
  public void setAuAge(int auAge) { 
    this.auAge = auAge; 
  } 
  @Override 
  /* 
   * When we only use Comparable, this is where we write sorting
   * logic. This method is called when we implement the Comparable
   * interface in our class and call Collections.sort()
   */ 
  public int compareTo(Author au){         
    return this.firstName.compareTo(au.firstName);   
  }
}

AuthorAgeComparator.java

import java.util.*;
class AuthorAgeComparator implements Comparator<Author>{
   public int compare(Author a1,Author a2){
     if(a1.auAge==a2.auAge)
       return 0;
   else if(a1.auAge>a2.auAge)
       return 1;
   else
       return -1;
  }
}

BookNameComparator.java

import java.util.*; 
public class BookNameComparator implements Comparator<Author>{ 
  public int compare(Author a1,Author a2){   
     return a1.bookName.compareTo(a2.bookName); 
  }  
}

SortingPgm.java

import java.util.ArrayList;  
import java.util.Collections;
public class SortingPgm{     
   public static void main(String args[]){    
     // List of objects of Author class      
     ArrayList<Author> al=new ArrayList<Author>();        
     al.add(new Author("Henry", "Tropic of Cancer",  45));
     al.add(new Author("Nalo", "Brown Girl in the Ring", 56));
     al.add(new Author("Frank", "300", 65));
     al.add(new Author("Deborah", "Sky Boys", 51));
     al.add(new Author("George R. R.", "A Song of Ice and Fire", 62));
     /*       
      * Sorting the list using Collections.sort() method, we       
      * can use this method because we have implemented the        
      * Comparable interface in our user defined class Author       
      */      
     System.out.println("Sorting by Author First Name:");      
     Collections.sort(al);        
     for(Author au: al){       
       System.out.println(au.getFirstName()+", "+au.getBookName()+", "+
           au.getAuAge());        
     } 
     /*Sorting using AuthorAgeComparator*/      
     System.out.println("Sorting by Author Age:");
     Collections.sort(al, new AuthorAgeComparator());
     for(Author au: al){       
       System.out.println(au.getFirstName()+", "+au.getBookName()+", "+
          au.getAuAge());        
     }             
     /*Sorting using BookNameComparator*/      
     System.out.println("Sorting by Book Name:");      
     Collections.sort(al, new BookNameComparator());      
     for(Author au: al){       
        System.out.println(au.getFirstName()+", "+au.getBookName()+", "+ 
           au.getAuAge());       
     }    
  }  
}  

Output:

Sorting by Author First Name:
Deborah, Sky Boys, 51
Frank, 300, 65
George R. R., A Song of Ice and Fire, 62
Henry, Tropic of Cancer, 45
Nalo, Brown Girl in the Ring, 56

Sorting by Author Age:
Henry, Tropic of Cancer, 45
Deborah, Sky Boys, 51
Nalo, Brown Girl in the Ring, 56
George R. R., A Song of Ice and Fire, 62
Frank, 300, 65

Sorting by Book Name:
Frank, 300, 65
George R. R., A Song of Ice and Fire, 62
Nalo, Brown Girl in the Ring, 56
Deborah, Sky Boys, 51
Henry, Tropic of Cancer, 45

Enjoyed this post? Try these related posts

  1. How to remove repeated elements from ArrayList?
  2. Remove Key-value mapping from TreeMap example
  3. How to synchronize HashMap in Java with example
  4. Java ArrayList get() Method example
  5. How to get sublist of an ArrayList with example
  6. Java ArrayList addAll(int index, Collection c) Method example

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Java Tutorial

  • Java Tutorial
  • OOPs Concepts

Java Collections

  • ArrayList
  • LinkedList
  • ArrayList vs LinkedList
  • Vector
  • ArrayList vs Vector
  • HashMap
  • TreeMap
  • LinkedHashMap
  • HashSet
  • TreeSet
  • LinkedHashSet
  • Hashtable
  • HashMap vs Hashtable
  • Queue
  • PriorityQueue
  • Deque & ArrayDeque
  • Iterator
  • ListIterator
  • Comparable Interface
  • Comparator Interface
  • Java Collections Interview Q

MORE ...

  • Java String
  • Exception handling
  • Java Multithreading
  • Java I/O
  • Java Serialization
  • Java Regex
  • Java AWT
  • Java Swing
  • Java Enum
  • Java Annotations

Copyright © 2012 – 2019 BeginnersBook . Privacy Policy . Sitemap