Vergleichbar -java.lang.Comparable: int compareTo(Object o1)
Ein vergleichbares Objekt kann sich mit einem anderen Objekt vergleichen. Die Klasse selbst muss die Schnittstelle java.lang.Comparable implementieren, um ihre Instanzen vergleichen zu können.
- Kann das aktuelle Objekt mit dem bereitgestellten Objekt vergleichen.
- Auf diese Weise können wir
only one sort sequence
basierend auf den Instanzeigenschaften implementieren . EX:Person.id
- Einige der vordefinierten Klassen wie String, Wrapper-Klassen, Datum und Kalender haben eine vergleichbare Schnittstelle implementiert.
Komparator -java.util.Comparator: int compare(Object o1, Object o2)
Ein Komparatorobjekt kann zwei verschiedene Objekte vergleichen. Die Klasse vergleicht nicht ihre Instanzen, sondern die Instanzen einiger anderer Klassen. Diese Komparatorklasse muss die Schnittstelle java.util.Comparator implementieren.
- Kann zwei Objekte des gleichen Typs vergleichen.
- Auf diese Weise können wir
many sort sequence
jede basierend auf den Instanzeigenschaften implementieren und benennen. EX:Person.id, Person.name, Person.age
- Wir können die Comparator-Schnittstelle für unsere vordefinierten Klassen für die benutzerdefinierte Sortierung implementieren.
Beispiel:
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)
}
}
- Für die benutzerdefinierte Sortierung wählen wir den Komparator @compare (o1, o2) für andere Szenarien. Wir wählen den vergleichbaren @compareTo (o1). Ohne Code zu ändern, wenn wir mehr als ein Feld sortieren möchten, verwenden wir den Komparator.
Für Java 8 Lambda: Comparator siehe meinen Beitrag.