====== The Comparable Interface for Sorting Objects ======
----
===== Objectives =====
* Learn how to sort collections of objects (such as PlayList of Songs) by implementing the Comparable interface.
----
===== Comparable & Sorting =====
* There are many sorting algorithms.
* The simple-to-understand bubble sort is among the least efficient sorting algorithms.
* More sophisticated algorithms will be covered in later courses.
* Modern programming languages make it largely unnecessary for programmers to write their own sorting algorithms.
* Java has java.util.Array.sort() and java.util.Collections.sort() that can be used to sort Arrays and ArrayLists of objects that have a natural sorting order.
* Natural sorting order: Numeric types (int, double), Strings
* Problem: Not all user-defined types have a natural sorting order
* Solution: The Comparable and Comparator **interfaces** (We will cover the Comparable interface only.)
* An object that implements the Comparable interface is capable of comparing itself with another object of the same class.
* The object's class itself must implements the java.lang.Comparable interface in order to be able to compare its instances.
* The compareTo() method of the Comparable interface:
* java.lang.Comparable: int compareTo(Object obj1)
* This method compares *this* object with the obj1 object. The returned int value has the following meanings:
1. positive - this object is greater than obj1
2. zero - this object equals to obj1
3. negative - this object is less than obj1
==== Employee Class example ====
* BlueJ project zip: ComparableEmployee
// The original Employee class:
public class Employee {
private int empId;
private String name;
private int age;
public Employee(int empId, String name, int age) {
// set values of fields
}
// getters & setters
}
* Next create a list of Employees.
* Employees are added to an ArrayList without any specific order in the following class.
import java.util.*;
public class Util {
public static ArrayList getEmployees() {
ArrayList col = new ArrayList();
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 ordering:
* Employee'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 {
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 the Collections.sort(ArrayList) method, sorting happens according to the ordering done inside this method.
* We'll write a class to test this natural ordering mechanism.
* Following class uses the Collections.sort(ArrayList) method to sort the given list in natural order.
import java.util.*;
public class TestEmployeeSort {
public static void main(String[] args) {
ArrayList coll = Util.getEmployees(); // use static Util.getEmployees()
Collections.sort(coll); // sort method
printList(coll);
}
private static void printList(ArrayList list) {
System.out.println("EmpId\tName\tAge");
for (Employee e: list) {
System.out.println(e.getEmpId() + "\t" + e.getName() + "\t" + e.getAge());
}
}
}
==== Song/Playlist Class example ====
* When we last looked at the Song/PlayList example, we were unable to sort an ArrayList of Song objects because Song objects did not have a natural sorting order (were not comparable to each other).
* By implementing the Comparable interface, we can make Songs comparable.
* This will allow Songs to be sorted using the Java Collections.sort() method.
* Basic example that sorts Songs by song name
* See the comparablesong1 package in the Comparable project.
* More advanced example in which the Songs can be sorted by other Song fields, such as artist, album and year
* This version uses a //static Song.setSortBy()// method.
* See the comparablesong2 package in the Comparable project.
----