Comparable -java.lang.Comparable: int compareTo(Object o1)
Un objeto comparable es capaz de compararse con otro objeto. La clase en sí debe implementar la interfaz java.lang.Comparable para poder comparar sus instancias.
- Capaz de comparar el objeto actual con el objeto proporcionado.
- Al usar esto, podemos implementar en
only one sort sequence
función de las propiedades de las instancias. EX:Person.id
- Algunas de las clases predefinidas como cadena, clases de envoltura, fecha, calendario han implementado una interfaz comparable.
Comparador -java.util.Comparator: int compare(Object o1, Object o2)
Un objeto comparador es capaz de comparar dos objetos diferentes. La clase no está comparando sus instancias, sino las instancias de alguna otra clase. Esta clase de comparador debe implementar la interfaz java.util.Comparator.
- Capaz de comparar dos objetos del mismo tipo.
- Al usar esto, podemos implementar
many sort sequence
y nombrar cada uno, según las propiedades de las instancias. EX:Person.id, Person.name, Person.age
- Podemos implementar la interfaz Comparator en nuestras clases predefinidas para una clasificación personalizada.
Ejemplo:
public class Employee implements Comparable<Employee> {
private int id;
private String name;
private int age;
private long salary;
// Many sort sequences can be created with different names.
public static Comparator<Employee> NameComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return e1.getName().compareTo(e2.getName());
}
};
public static Comparator<Employee> idComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return Integer.valueOf(e1.getId()).compareTo(Integer.valueOf(e2.getId()));
}
};
public Employee() { }
public Employee(int id, String name, int age, long salary){
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
// setters and getters.
// Only one sort sequence can be created with in the class.
@Override
public int compareTo(Employee e) {
//return Integer.valueOf(this.id).compareTo(Integer.valueOf(e.id));
//return Character.toString(this.name.charAt(0)).compareToIgnoreCase(Character.toString(e.name.charAt(0)));
if (this.id > e.id) {
return 1;
}else if(this.id < e.id){
return -1;
}else {
return Character.toString(this.name.charAt(0)).compareToIgnoreCase(Character.toString(e.name.charAt(0)));
}
}
public static void main(String[] args) {
Employee e1 = new Employee(5, "Yash", 22, 1000);
Employee e2 = new Employee(8, "Tharun", 24, 25000);
List<Employee> list = new ArrayList<Employee>();
list.add(e1);
list.add(e2);
Collections.sort(list); // call @compareTo(o1)
Collections.sort(list, Employee.nameComparator); // call @compare (o1,o2)
Collections.sort(list, Employee.idComparator); // call @compare (o1,o2)
}
}
- Para la clasificación personalizada, optamos por el comparador @compare (o1, o2) para otros escenarios, optamos por el @compareTo (o1) comparable, sin cambiar el código si queremos ordenar más de un campo, entonces usamos el comparador.
Para Java 8 Lambda: Comparator, consulte mi publicación.