Natural comparable vs explicit comparator sorting
suggest changeThere are two Collections.sort()
methods:
- One that takes a
List<T>
as a parameter whereT
must implement Comparable and override thecompareTo()
method that determines sort order. - One that takes a List and a Comparator as the arguments, where the Comparator determines the sort order.
First, here is a Person class that implements Comparable:
public class Person implements Comparable<Person> { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Person o) { return this.getAge() - o.getAge(); } @Override public String toString() { return this.getAge()+"-"+this.getName(); } }
Here is how you would use the above class to sort a List in the natural ordering of its elements, defined by the compareTo()
method override:
//-- usage List<Person> pList = new ArrayList<Person>(); Person p = new Person(); p.setName("A"); p.setAge(10); pList.add(p); p = new Person(); p.setName("Z"); p.setAge(20); pList.add(p); p = new Person(); p.setName("D"); p.setAge(30); pList.add(p); //-- natural sorting i.e comes with object implementation, by age Collections.sort(pList); System.out.println(pList);
Here is how you would use an anonymous inline Comparator to sort a List that does not implement Comparable, or in this case, to sort a List in an order other than the natural ordering:
//-- explicit sorting, define sort on another property here goes with name Collections.sort(pList, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getName().compareTo(o2.getName()); } }); System.out.println(pList);
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents