Natural ordering a collection can be done by implementing Comparable interface. By implementing Comparable, sorting an array of objects or a collection (List etc) is as simple as:
{
@Override
public int compare(Employee obj1, Employee obj2) {
int result = 0;
Employee emp1 = (Employee) obj1;
Employee emp2 = (Employee) obj2;
result = (emp1.getEmployeeId() < emp2.getEmployeeId()) ? -1 : (emp1.getEmployeeId() > emp2.getEmployeeId()) ? 1 : 0;
if(result == 0){
result = emp1.getEmployeeName().compareTo(emp2.getEmployeeName());
}
return result;
}
}
SortEmployees.java
public class SortEmployees {
public static void main(String[] args) {
List employeeList = new ArrayList();
employeeList.add(new Employee(1, "Sam"));
employeeList.add(new Employee(2, "John"));
employeeList.add(new Employee(1, "Raun"));
Collections.sort(employeeList, new EmployeeComparator());
for (Employee employee : employeeList) {
System.out.println(employee);
}
}
}
Output:
Employee [employeeId=1, employeeName=Raun]
Employee [employeeId=1, employeeName=Sam]
Employee [employeeId=2, employeeName=John]
Arrays.sort(myArray);
Collections.sort(myCollection);
For classes that don’t implement Comparable interface, or when one needs even more control over ordering based on multiple attributes, a Comparator interface should be used. Let's try to sort by implementing both the interfaces.
Sorting using Comparable interface
Employee represents the entity that needs to be sorted.
Employee.java
public class Employee implements Comparable {
private int employeeId;
private String employeeName;
public Employee(int employeeId, String employeeName) {
this.employeeId = employeeId;
this.employeeName = employeeName;
}
@Override
public int compareTo(Employee emp) {
Employee otherEmployee = (Employee) emp;
return (this.employeeId < otherEmployee.employeeId) ? -1 : (this.employeeId > otherEmployee.employeeId) ? 1 : 0;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("Employee [");
sb.append("employeeId=").append(employeeId);
sb.append(", employeeName=").append(employeeName);
sb.append("]");
return sb.toString();
}
}
SortEmployees.java
public class SortEmployees {
public static void main(String[] args) {
List employeeList = new ArrayList();
employeeList.add(new Employee(1, "Sam"));
employeeList.add(new Employee(2, "John"));
employeeList.add(new Employee(1, "Raun"));
Collections.sort(employeeList); // sorts using compareTo method
for (Employee employee : employeeList) {
System.out.println(employee);
}
}
}
public static void main(String[] args) {
List
employeeList.add(new Employee(1, "Sam"));
employeeList.add(new Employee(2, "John"));
employeeList.add(new Employee(1, "Raun"));
Collections.sort(employeeList); // sorts using compareTo method
for (Employee employee : employeeList) {
System.out.println(employee);
}
}
}
Output:
Employee [employeeId=1, employeeName=Sam]
Employee [employeeId=1, employeeName=Raun]
Employee [employeeId=2, employeeName=John]
Sorting using Comparable interface
Here, we need a new class which will implement the Comparator interface and its instance will be passed by sorting the collection of employees list.
EmployeeComparator.java
public class EmployeeComparator implements Comparator@Override
public int compare(Employee obj1, Employee obj2) {
int result = 0;
Employee emp1 = (Employee) obj1;
Employee emp2 = (Employee) obj2;
result = (emp1.getEmployeeId() < emp2.getEmployeeId()) ? -1 : (emp1.getEmployeeId() > emp2.getEmployeeId()) ? 1 : 0;
if(result == 0){
result = emp1.getEmployeeName().compareTo(emp2.getEmployeeName());
}
return result;
}
}
SortEmployees.java
public class SortEmployees {
public static void main(String[] args) {
List
employeeList.add(new Employee(1, "Sam"));
employeeList.add(new Employee(2, "John"));
employeeList.add(new Employee(1, "Raun"));
Collections.sort(employeeList, new EmployeeComparator());
for (Employee employee : employeeList) {
System.out.println(employee);
}
}
}
Output:
Employee [employeeId=1, employeeName=Raun]
Employee [employeeId=1, employeeName=Sam]
Employee [employeeId=2, employeeName=John]