Pages

Thursday, July 19, 2012

Comparator and Comparable example in Java

java.lang.Comparable
--------------------------
int compareTo(Object o) : This method compares 'this' object with 'o' object

if the int value is
positive - 'this' object is greater than 'o' object
zero - 'this' object is equals with 'o' object
negative - 'this' object is less than 'o' object

java.util.Comparator
-----------------------------
int compare(Object o1,Object o2) : This method compares o1 and o2 objects.

if the int values is
positive - o1 is greater than o2
zero - o1 equals o2
negative - o1 is less than o2

A simple example

showing how to use Comparable and Comparator interfaces :

First create a pojo called NetworkProvider.java that implements Comparable interface.
package com.sample.sort;

public class NetworkProvider implements Comparable<Object> {

 private String netName;
 private String headQuarters;
 private Integer positionInIndia;

 public NetworkProvider(String name, String hq, int position) {
  this.netName = name;
  this.headQuarters = hq;
  this.positionInIndia = position;
 }

 public String getNetName() {
  return netName;
 }

 public void setNetName(String netName) {
  this.netName = netName;
 }

 public String getHeadQuarters() {
  return headQuarters;
 }

 public void setHeadQuarters(String headQuarters) {
  this.headQuarters = headQuarters;
 }

 public Integer getPositionInIndia() {
  return positionInIndia;
 }

 public void setPositionInIndia(Integer positionInIndia) {
  this.positionInIndia = positionInIndia;
 }

 @Override
 public int compareTo(Object o) {
  NetworkProvider n = (NetworkProvider) o;
  return this.getPositionInIndia().compareTo(n.getPositionInIndia());
 }
}
Now create a class called GetNetworkDetails.java that will add the Network details to ArrayList.
package com.sample.sort;

import java.util.ArrayList;
import java.util.List;

public class GetNetworkDetails {

 public static List<NetworkProvider> getNetworkDetails() {
  List<NetworkProvider> list = new ArrayList<NetworkProvider>();
  list.add(new NetworkProvider("Vodaone", "London", 3));
  list.add(new NetworkProvider("Airtel", "India", 2));
  list.add(new NetworkProvider("BSNL", "India", 1));
  return list;
 }
}

If we want the ordering by 'name' preference(you can do with any field) then implement the comparator interface, without touching the original code. 
SortByName.java
package com.sample.sort;

import java.util.Comparator;

public class SortByName implements Comparator<NetworkProvider> {

 @Override
 public int compare(NetworkProvider n1, NetworkProvider n2) {
  return n1.getNetName().compareTo(n2.getNetName());
 }

}

Now create a class NetworkMain.java that will show the details.
package com.sample.sort;

import java.util.Collections;
import java.util.List;

public class NetworkMain {

 public static void display(List<NetworkProvider> list) {
  for (NetworkProvider n : list) {
   System.out.print("Position :"   n.getPositionInIndia()   "\t");
   System.out.print("Name : "   n.getNetName()   "\t");
   System.out.print("HeadQuarters : "   n.getHeadQuarters()   "\n");
  }
 }

 public static void main(String[] args) {
  List<NetworkProvider> list = GetNetworkDetails.getNetworkDetails();
  System.out
    .println("Sort by Natural order"   "\n"   "*********************");
  Collections.sort(list);
  display(list);

  System.out.println("\n" "Sort by Name"   "\n"   "*********************");
  Collections.sort(list, new SortByName());
  display(list);
 }
}
output:
Sort by Natural order
*********************
Position :1    Name : BSNL    HeadQuarters : India
Position :2    Name : Airtel    HeadQuarters : India
Position :3    Name : Vodaone    HeadQuarters : London

Sort by Name
*********************
Position :2    Name : Airtel    HeadQuarters : India
Position :1    Name : BSNL    HeadQuarters : India
Position :3    Name : Vodaone    HeadQuarters : London

No comments:

Post a Comment