Showing posts with label compareTo(). Show all posts
Showing posts with label compareTo(). Show all posts

Tuesday, December 20, 2011

How to implement MultyFieldComparable

Java.Util.Comparable is an interface used for sorting collections. In previous example, we used Comparable for sorting by only one field. In this example, we will see a more complex Comparable which can be used to sort a list of employees based on the name, then on department and then on age. The example consists of the following 2 classes.

Employee.java:

package com.soft.model;

public class Employee implements Comparable{
private String name;
private String department;
private int age;
public String getName() {
            return name;
}
public void setName(String name) {
            this.name = name;
}
public String getDepartment() {
            return department;
}
public void setDepartment(String department) {
            this.department = department;
}
public int getAge() {
            return age;
}
public void setAge(int age) {
            this.age = age;
}
@Override
public int compareTo(Object obj) {
            Employee employee=(Employee)obj;
            if(this.getName().compareTo(employee.getName())==0){
                        if(this.getDepartment().compareTo(employee.getDepartment())==0){
                                    return this.getAge()-employee.getAge();
                        }else{
                                    return this.getDepartment().compareTo(employee.getDepartment());
                        }
            }else{
                        return this.getName().compareTo(employee.getName());
            }
}

}



MultyFieldComparableExample.java:

package com.soft.examples;

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

import com.soft.model.Employee;

public class MultyFieldComparableExample {
            public static void main(String[] args) {
                        List<Employee> list= new ArrayList<Employee>();
                        Employee e=new Employee();
                        e.setName("Danial Fritz");
                        e.setDepartment("Field Based Development");
                        e.setAge(36);
                        list.add(e);
                        e=new Employee();
                        e.setName("Denis Khoo");
                        e.setDepartment("Project Management");
                        e.setAge(30);
                        list.add(e);
                        e=new Employee();
                        e.setName("Joe Kum");
                        e.setDepartment("Adminstration");
                        e.setAge(40);
                        list.add(e);
                        e=new Employee();
                        e.setName("Anil Kumar");
                        e.setDepartment("Information Technology");
                        e.setAge(26);
                        list.add(e);
                        e=new Employee();
                        e.setName("Anil Kumar");
                        e.setDepartment("Information Technology");
                        e.setAge(26);
                        list.add(e);
                        e=new Employee();
                        e.setName("Anil Kumar");
                        e.setDepartment("Information Technology");
                        e.setAge(25);
                        list.add(e);
                        e=new Employee();
                        e.setName("Anil Kumar");
                        e.setDepartment("Project Management");
                        e.setAge(26);
                        list.add(e);
                        System.out.println("************ Before Sorting ***********");
                        for (int i=0;i< list.size();i++){
                                    System.out.println(list.get(i).getName()+"-----"+list.get(i).getDepartment()+"-----"+list.get(i).getAge());
                        }
                        System.out.println("************ Name, Department, Age Sorting through Comparable ***********");
                        Collections.sort(list);
                        for (int i=0;i< list.size();i++){
                                    System.out.println(list.get(i).getName()+"-----"+list.get(i).getDepartment()+"-----"+list.get(i).getAge());
                        }
                       
            }
}


Output:

************ Before Sorting ***********
Danial Fritz   ----- Field Based Development   ----- 36
Denis Khoo     ----- Project Management        ----- 30
Joe Kum        ----- Adminstration             ----- 40
Anil Kumar     ----- Information Technology    ----- 26
Anil Kumar     ----- Information Technology    ----- 26
Anil Kumar     ----- Information Technology    ----- 25
Anil Kumar-----Project Management-----26

****** Name, Department, Age Sorting through Comparable *******

Anil Kumar     ----- Information Technology     ----- 25
Anil Kumar     ----- Information Technology     ----- 26
Anil Kumar     ----- Information Technology     ----- 26
Anil Kumar     ----- Project Management         ----- 26
Danial Fritz   ----- Field Based Development    ----- 36
Denis Khoo     ----- Project Management         ----- 30
Joe Kum        ----- Adminstration              ----- 40

An example of a MultyFieldComparator can be found at
An example of a simple Comparable can be found at
You may also find the following articles helpful.




_________________________________________________________________________

How to implement a java.lang.Comparable

Java.lang.Comparable is an interface used for sorting collections. The classes implementing Comparables must implement the compareTo() method. Here is a simple example of how a comparable can be used. The example sorts a list of employees on the basis of their age. In this example we have a simple pojo named Employee.java implementing a java.lang.Comparable interface by overriding the compareTo method and a main class to demonstrate the functionality.

Employee.java:

package com.soft.model;

public class Employee implements Comparable{
private String name;
private String department;
private int age;
public String getName() {
            return name;
}
public void setName(String name) {
            this.name = name;
}
public String getDepartment() {
            return department;
}
public void setDepartment(String department) {
            this.department = department;
}
public int getAge() {
            return age;
}
public void setAge(int age) {
            this.age = age;
}
@Override
public int compareTo(Object o) {
            if(this.age>((Employee)o).getAge()){
                        return 1;
            } else if(this.age<((Employee)o).getAge()){
                        return -1;
            } else{
                        return 0;
            }
}
}



ComparableExample:

package com.soft.examples;

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

import com.soft.model.Employee;

public class ComparableExample {
            public static void main(String[] args) {
                        List<Employee> list= new ArrayList<Employee>();
                        Employee e=new Employee();
                        e.setName("Danial Fritz");
                        e.setDepartment("Field Based Development");
                        e.setAge(36);
                        list.add(e);
                        e=new Employee();
                        e.setName("Denis Khoo");
                        e.setDepartment("Project Management");
                        e.setAge(30);
                        list.add(e);
                        e=new Employee();
                        e.setName("Joe Kum");
                        e.setDepartment("Adminstration");
                        e.setAge(40);
                        list.add(e);
                        e=new Employee();
                        e.setName("Anil Kumar");
                        e.setDepartment("Information Technology");
                        e.setAge(26);
                        list.add(e);
                        System.out.println("************ Before Sorting ***********");
                        for (int i=0;i< list.size();i++){
                                    System.out.println(list.get(i).getName()+"-----"+list.get(i).getDepartment()+"-----"+list.get(i).getAge());
                        }
                        System.out.println("************ Age Sorting through Comparable ***********");
                        Collections.sort(list);
                        for (int i=0;i< list.size();i++){
                                    System.out.println(list.get(i).getName()+"-----"+list.get(i).getDepartment()+"-----"+list.get(i).getAge());
                        }
                       
            }
}


This functionality can also be achieved with a java.util.Comparator, the implementation of which is given at
The differences between java.util.Comparator and java.lang.Comparable interfaces are given at



Differences between Comparator and Comparable

Following is a table of the differences between java.util.Comparator and  java.lang.Comparable  interfaces. If I have missed any point, please notify me of that.

The implementation of java.util.Comparator and java.lang.Comparable can be found at
Comparator and
Comparable respectively.



Comparator
Comparable
Package
Java.util
Java.lang
Method
public int compare (Object o1, Object o2)

returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second
public int compareTo(Object o)

returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object
Main Difference
Compares 2 objects provided to it.
Compares this object to the object given.


Used to implement natural ordering of objects. Implemented by String, Date and wrapper classes.


If any class implements Comparable interface then collection of that object either List or Array can be sorted automatically by using  Collections.sort() or Arrays.sort() method and object will be sorted based on there natural order defined by CompareTo method.


Objects which implement Comparable in Java  can be used as keys in a sorted map or elements in a sorted set for example TreeSet, without specifying any Comparator.
Implementation
Normally, for a bean named Employee(String name, String Department, int Age), if we want to implement a name comparator, we need two classes: bean class(Employee) and comparator class as
public class Employee {} And
public class EmployeeNameComparator implements Comparator{}
For a bean name Employee(String name, String Department, int Age), if we want to implement a name comparable, we do not need to create a new class but instead we will implement it through the same Employee class as
public class Employee implements Comparable{}