In this post, you can learn how to sort Java object specially ArrayList with custom class as generics using Comparable and Comparator interface. In ArrayList sorting with datatype as generics then no need to use comparable and comparator interface, you can use directly Collections.sort(list) methods.
1) Sort an Array
Use Arrays.sort() method to sort an array. See the below example,
String[] departments = new String[] {"IT", "Engineering", "Support", "Sales"};
Arrays.sort(departments);
for (String dept : departments) {
System.out.println(dept);
}
output : Engineering
IT
Sales
Support
2) Sort an ArrayList without using Comparable or Comparator
If you want to sort an ArrayList using datatype as Generics then directly you can pass the arraylist parameter in Collections sort method.
Example,
List<String> list = Arrays.asList("IT", "Engineering", "Support", "Sales");
Collections.sort(list);
//after sorting
for (String dept : list) {
System.out.println("depts : "+ dept);
}
output : Engineering
IT
Sales
Support
3) Sort an ArrayList of custom objects by Property (Using Comparable interface)
If you are sorting the custom objects of ArrayList without using Comparable interface, you will get exception, see below code.
public class Employee {
private int id;
private String name;
public int getId () {
return id;
}
public String getName () {
return name;
}
public Employee (int id, String name) {
this.id = id;
this.name = name;
}
Sorting Employee class objects,
Employee[] emp = new Employee[3];
emp[0] = new Employee (1, "Mahesh");
emp[1] = new Employee (2, "Kiran");
emp[2] = new Employee (3, "Rajesh");
List<Employee> list = new ArrayList<Employee>();
list.add(emp[0]);
list.add(emp[1]);
list.add(emp[2]);
Collections.sort(list);
for (Employee e : list) {
System.out.println(e);
}
when you try to run this code , it throws Run time exception :--
Exception in thread "main" java.lang.ClassCastException.
To sort the custom object based on property then you can use any one Comparable or Comparator interface. In the above Employee class, you can implement with Comparable interface and implement compareTo() method. Keep sorting logic in compareTo() method. See the Employee class.
public class Employee implements Comparable<Employee> {
private int id;
private String name;
public int getId () {
return id;
}
public String getName () {
return name;
}
public Employee (int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compareTo (Employee emp) {
return this.id - (Integer)emp.getId();
}
The compareTo(Object arg) method returns the negative integer or zero or positive integer, If it returns the negative integer then this object is less than passed argument, returns zero then this object is equal to passed argument, returns positive integer then this object is greater than passed argument.
Sorting the above Employee class based on id property using ArrayList is as follows,
Employee[] emp = new Employee[3];
emp[0] = new Employee (3, "Mahesh");
emp[1] = new Employee (1, "Kiran");
emp[2] = new Employee (5, "Rajesh");
List<Employee> list = new ArrayList<Employee>();
list.add(emp[0]);
list.add(emp[1]);
list.add(emp[2]);
Collections.sort(list);
for (Employee e : list) {
System.out.println(e.getName());
}
output :- Kiran
Mahesh
Rajesh
4) Sort an ArrayList of custom objects by Property (Using Comparator interface)
Using Comparable interface, we can sort single property and that should be an integer type. If you can sort the ArrayList based on multiple properties then use Comparator interface. In order to implement the Comparator interface, to implement the compare(Object obj1, Object obj2) methdod of Comparator interface.
See the below Employee class,
public class Employee implements Comparable<Employee> {
private int id;
private String name;
public int getId () {
return id;
}
public String getName () {
return name;
}
public Employee (int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compare(Employee emp1, Employee emp2) {
return emp1.getName().compareTo(emp2.getName());
}
Sorting the above Employee class based on multiple property using ArrayList is as follows,
Employee[] emp = new Employee[3];
emp[0] = new Employee (3, "Mahesh");
emp[1] = new Employee (1, "Kiran");
emp[2] = new Employee (5, "Rajesh");
List<Employee> list = new ArrayList<Employee>();
list.add(emp[0]);
list.add(emp[1]);
list.add(emp[2]);
Collections.sort(list, new Emplyee());
for (Employee e : list) {
System.out.println(e.getName());
}
output :- Kiran
Mahesh
Rajesh
Related Post : --
Difference between Comparable & Comparator Interface in Java
1) Sort an Array
Use Arrays.sort() method to sort an array. See the below example,
String[] departments = new String[] {"IT", "Engineering", "Support", "Sales"};
Arrays.sort(departments);
for (String dept : departments) {
System.out.println(dept);
}
output : Engineering
IT
Sales
Support
2) Sort an ArrayList without using Comparable or Comparator
If you want to sort an ArrayList using datatype as Generics then directly you can pass the arraylist parameter in Collections sort method.
Example,
List<String> list = Arrays.asList("IT", "Engineering", "Support", "Sales");
Collections.sort(list);
//after sorting
for (String dept : list) {
System.out.println("depts : "+ dept);
}
output : Engineering
IT
Sales
Support
3) Sort an ArrayList of custom objects by Property (Using Comparable interface)
If you are sorting the custom objects of ArrayList without using Comparable interface, you will get exception, see below code.
public class Employee {
private int id;
private String name;
public int getId () {
return id;
}
public String getName () {
return name;
}
public Employee (int id, String name) {
this.id = id;
this.name = name;
}
Sorting Employee class objects,
Employee[] emp = new Employee[3];
emp[0] = new Employee (1, "Mahesh");
emp[1] = new Employee (2, "Kiran");
emp[2] = new Employee (3, "Rajesh");
List<Employee> list = new ArrayList<Employee>();
list.add(emp[0]);
list.add(emp[1]);
list.add(emp[2]);
Collections.sort(list);
for (Employee e : list) {
System.out.println(e);
}
when you try to run this code , it throws Run time exception :--
Exception in thread "main" java.lang.ClassCastException.
To sort the custom object based on property then you can use any one Comparable or Comparator interface. In the above Employee class, you can implement with Comparable interface and implement compareTo() method. Keep sorting logic in compareTo() method. See the Employee class.
public class Employee implements Comparable<Employee> {
private int id;
private String name;
public int getId () {
return id;
}
public String getName () {
return name;
}
public Employee (int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compareTo (Employee emp) {
return this.id - (Integer)emp.getId();
}
The compareTo(Object arg) method returns the negative integer or zero or positive integer, If it returns the negative integer then this object is less than passed argument, returns zero then this object is equal to passed argument, returns positive integer then this object is greater than passed argument.
Sorting the above Employee class based on id property using ArrayList is as follows,
Employee[] emp = new Employee[3];
emp[0] = new Employee (3, "Mahesh");
emp[1] = new Employee (1, "Kiran");
emp[2] = new Employee (5, "Rajesh");
List<Employee> list = new ArrayList<Employee>();
list.add(emp[0]);
list.add(emp[1]);
list.add(emp[2]);
Collections.sort(list);
for (Employee e : list) {
System.out.println(e.getName());
}
output :- Kiran
Mahesh
Rajesh
4) Sort an ArrayList of custom objects by Property (Using Comparator interface)
Using Comparable interface, we can sort single property and that should be an integer type. If you can sort the ArrayList based on multiple properties then use Comparator interface. In order to implement the Comparator interface, to implement the compare(Object obj1, Object obj2) methdod of Comparator interface.
See the below Employee class,
public class Employee implements Comparable<Employee> {
private int id;
private String name;
public int getId () {
return id;
}
public String getName () {
return name;
}
public Employee (int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compare(Employee emp1, Employee emp2) {
return emp1.getName().compareTo(emp2.getName());
}
Sorting the above Employee class based on multiple property using ArrayList is as follows,
Employee[] emp = new Employee[3];
emp[0] = new Employee (3, "Mahesh");
emp[1] = new Employee (1, "Kiran");
emp[2] = new Employee (5, "Rajesh");
List<Employee> list = new ArrayList<Employee>();
list.add(emp[0]);
list.add(emp[1]);
list.add(emp[2]);
Collections.sort(list, new Emplyee());
for (Employee e : list) {
System.out.println(e.getName());
}
output :- Kiran
Mahesh
Rajesh
Related Post : --
Difference between Comparable & Comparator Interface in Java