Java Sorting: Comparator vs Comparable Aasim Naseem, September 20, 2010March 27, 2024 Hello All … hope everyone is in good health and enjoying the Allah Almighty’s blessings. I was working on a task where i need to sort a collection (List) of objects on the basis of some attribute within single element of that list. Though i have used comparators many times in applications but today first time i wrote my first comparator and sort a list using Collection.sort(listName, comparatorClass). Sharing this knowledge with you people too.What are Java Comparators and Comparables? As both names suggest (and you may have guessed), these are used for comparing objects in Java. Using these concepts; Java objects can be sorted according to a predefined order.Two of these concepts can be explained as follows.ComparableA comparable object is capable of comparing itself with another object. The class itself must implements the java.lang.Comparable interface in order to be able to compare its instances. ComparatorA comparator object is capable of comparing two different objects. The class is not comparing its instances, but some other class’s instances. This comparator class must implement the java.util.Comparator interface.Do we need to compare objects? The simplest answer is yes. When there is a list of objects, ordering these objects into different orders becomes a must in some situations. For example; think of displaying a list of employee objects in a web page. Generally employees may be displayed by sorting them using the employee id. Also there will be requirements to sort them according to the name or age as well. In these situations both these (above defined) concepts will become handy.How to use these?There are two interfaces in Java to support these concepts, and each of these has one method to be implemented by user. Those are;java.lang.Comparable: int compareTo(Object o1) This method compares this object with o1 object. Returned int value has the following meanings.positive – this object is greater than o1zero – this object equals to o1negative – this object is less than o1java.util.Comparator: int compare(Object o1, Objecto2) This method compares o1 and o2 objects. Returned int value has the following meanings.positive – o1 is greater than o2zero – o1 equals to o2negative – o1 is less than o1java.util.Collections.sort(List) and java.util.Arrays.sort(Object[]) methods can be used to sort using natural ordering of objects. java.util.Collections.sort(List, Comparator) and java.util.Arrays.sort(Object[], Comparator) methods can be used if a Comparator is available for comparison.The above explained Employee example is a good candidate for explaining these two concepts. First we’ll write a simple Java bean to represent the Employee.public class Employee { private int empId; private String name; private int age; public Employee(int empId, String name, int age) { // set values on attributes } // getters & setters }Next we’ll create a list of Employees for using in different sorting requirements. Employees are added to a List without any specific order in the following class.import java.util.*; public class Util { public static List<Employee> getEmployees() { List<Employee> col = new ArrayList<Employee>(); col.add(new Employee(5, "Frank", 28)); col.add(new Employee(1, "Jorge", 19)); col.add(new Employee(6, "Bill", 34)); col.add(new Employee(3, "Michel", 10)); col.add(new Employee(7, "Simpson", 8)); col.add(new Employee(4, "Clerk",16 )); col.add(new Employee(8, "Lee", 40)); col.add(new Employee(2, "Mark", 30)); return col; } }Sorting in natural orderingEmployee’s natural ordering would be done according to the employee id. For that, above Employee class must be altered to add the comparing ability as follows.public class Employee implements Comparable<Employee> { private int empId; private String name; private int age; /** * Compare a given Employee with this object. * If employee id of this object is * greater than the received object, * then this object is greater than the other. */ public int compareTo(Employee o) { return this.empId - o.empId ; } …. }The new compareTo() method does the trick of implementing the natural ordering of the instances. So if a collection of Employee objects is sorted using Collections.sort(List) method; sorting happens according to the ordering done inside this method.We’ll write a class to test this natural ordering mechanism. Following class use the Collections.sort(List) method to sort the given list in natural order.import java.util.*; public class TestEmployeeSort { public static void main(String[] args) { List coll = Util.getEmployees(); Collections.sort(coll); // sort method printList(coll); } private static void printList(List<Employee> list) { System.out.println("EmpId\tName\tAge"); for (Employee e: list) { System.out.println(e.getEmpId() + "\t" + e.getName() + "\t" + e.getAge()); } } } EmpId Name Age 1 Jorge 19 2 Mark 30 3 Michel 10 4 Clerk 16 5 Frank 28 6 Bill 34 7 Simp 8 8 Lee 40Sorting by other fieldsIf we need to sort using other fields of the employee, we’ll have to change the Employee class’s compareTo() method to use those fields. But then we’ll loose this empId based sorting mechanism. This is not a good alternative if we need to sort using different fields at different occasions. But no need to worry; Comparator is there to save us.By writing a class that implements the java.util.Comparator interface, you can sort Employees using any field as you wish even without touching the Employee class itself; Employee class does not need to implement java.lang.Comparable or java.util.Comparator interface. Sorting by name field Following EmpSortByName class is used to sort Employee instances according to the name field. In this class, inside the compare() method sorting mechanism is implemented. In compare() method we get two Employee instances and we have to return which object is greater.public class EmpSortByName implements Comparator<Employee>{ public int compare(Employee o1, Employee o2) { return o1.getName().compareTo(o2.getName()); } }Watch out: Here, String class’s compareTo() method is used in comparing the name fields (which are Strings).Now to test this sorting mechanism, you must use the Collections.sort(List, Comparator) method instead of Collections.sort(List) method. Now change the TestEmployeeSort class as follows. See how the EmpSortByName comparator is used inside sort method.Watch out: Here, String class’s compareTo() method is used in comparing the name fields (which are Strings).Now to test this sorting mechanism, you must use the Collections.sort(List, Comparator) method instead of Collections.sort(List) method. Now change the TestEmployeeSort class as follows. See how the EmpSortByName comparator is used inside sort method.import java.util.*; public class TestEmployeeSort { public static void main(String[] args) { List coll = Util.getEmployees(); //Collections.sort(coll); //use Comparator implementation Collections.sort(coll, new EmpSortByName()); printList(coll); } private static void printList(List<Employee> list) { System.out.println("EmpId\tName\tAge"); for (Employee e: list) { System.out.println(e.getEmpId() + "\t" + e.getName() + "\t" + e.getAge()); } } }Now the result would be as follows. Check whether the employees are sorted correctly by the name String field. You’ll see that these are sorted alphabetically.EmpId Name Age6 Bill 34 4 Clerk 16 5 Frank 28 1 Jorge 19 8 Lee 40 2 Mark 30 3 Michel 10 7 Simp 8Sorting by empId field Even the ordering by empId (previously done using Comparable) can be implemented using Comparator; following class does that.public class EmpSortByEmpId implements Comparator<Employee>{ public int compare(Employee o1, Employee o2) { return o1.getEmpId().compareTo(o2.getEmpId()); } } Explore furtherDo not stop here. Work on the followings by yourselves and sharpen knowledge on these concepts.Sort employees using name, age, empId in this order (ie: when names are equal, try age and then next empId)Explore how & why equals() method and compare()/compareTo() methods must be consistence.If you have any issues on these concepts; please add those in the comments section and we’ll get back to you.Aasim NaseemI’m an engineer by profession, a blogger and a photojournalist by hobby. Seasonal writer at LAFZ Media UK. I write on different topics and things around us. Contact me at +971.56.126.8842 or Aasim.Naseem@outlook.com General / Others Tips & Tutorials ComparableComparatorComparator vs ComparablecompareTo()Java Sortingjava.lang.Comparable: int compareTo(Object o1)java.util.Comparator: int compare(Object o1Objecto2)
Simply discovered your web page through Yahoo and I consider this can be a disgrace that you are not ranked more due to the fact that that is a Great post. To switch this I determined to avoid wasting your Blog to my RSS reader and I will try to point out you in one of my posts since you actually deserv extra readers when publishing content material of this high quality.Reply
looking for seo services ? validate out our website templates and acquire your own falsh website through despite available today, huge electing of unchained flash templates for you online, profuse brand-new designs with ir without flash. so choose your free flash template from the larget flash templates selection. so get your free website templates now and build your free website . visit the latest online casino games. vs the all new casino games guide. looking for sex ? or new casino games ? Amex Casino . few more amex casino sites. online blackjack .Reply
Top site, I had not noticed aasims.wordpress.com previously during my searches! Continue the excellent work!Reply
Your blog is really great.I will explore it more in future since i am interested in blackberry application development. i really liked your blogReply
I have been back here 3 times now and am absolutely loving the energy on this discussion. Thanks for a fantastic outlet to read top quality information.Reply
You made some good points there. I did a search on the topic and found most people will agree with your blog.Reply
why r these people putting allah everywhere …… what u have wriiten here for java it is fabulous but is it neccessary to put allah and all that… here in the starting of solution.. thing beyond allah and all this ……Reply