Comparator und Comparable

Geschrieben von Michael Biesmann & Fabian Markert
0 Comments

1. Einleitung
2. Was sind Comparatoren und Comparables?
3. Wofür werden sie verwendet?
4. Welche Gemeinsamkeiten haben Comparatoren und Comparables?
5. Was ist der Unterschied zwischen Comparatoren und Comparables?
6. Wie funktioniert ein Comparator?
7. Wie sieht ein Comparator aus?
7.1. Beispiel für einen Comparator:
7.1.1. Benutzte Datenklasse:
7.1.2. ein Attribut Sortierung
7.1.3. mehrfach Attribut Sortierung
8. Wie funktioniert ein Comparable?
9. Wie sieht ein Comparable aus?
9.1. Beispiel für einen Comparable:
9.1.1. ein Attribut sortierung
9.1.2. mehrfach Attribut sortierung
10. Wie wendet man Comparatoren und Comparables an?
10.1. Anwendung von Comparatoren
10.2. Anwendung von Comparable

1. Einleitung

Dies ist der dritte von drei Posts, bevor wir uns mit dem Hauptthema befassen. In diesem Post gehen wir auf Comparatoren und Comparables ein. Den Fragestellungen, den wir uns hier stellen, sind:

Teil 1 Teil 2

2. Was sind Comparatoren und Comparables?

Comparatoren sind Klassen, die das Interface java.util.Comparator<T> implementieren. Comparables sind Klassen, die ihrerseits das Interface java.lang.Comparable<T> implementieren. Wie in den vorherigen Posts erklärt, steht das hier für einen generischen Datentyp. Beide Interfaces existieren seit der Java Version 1.2. Die beiden Interfaces sind seit der Java Version 1.5 generisch.


3. Wofür werden sie verwendet?

Beide Interfaces werden für das Sortieren von Collection-wertigen Datenobjekten eingesetzt.


4. Welche Gemeinsamkeiten haben Comparatoren und Comparables?


5. Was ist der Unterschied zwischen Comparatoren und Comparables?

Der Unterschied liegt in den Methodennamen und den Übergabeparametern der Methoden. Comparatoren benutzen die Methode compare() und Comparables benutzen die Methode compareTo(). Comparables werden in der Datenklasse implementiert. Somit sind Comparables die Standard Sortierfunktionalität der Datenklassen. Die Einschränkung die dabei existiert, ist die, dass man nur ein Comparable pro Datenklasse definieren kann. Der Vorteil, den die Comparatoren haben, liegt genau darin begründet, dass man mehr als nur eine Möglichkeit anbieten kann, wie man Datenklassen sortieren kann.


6. Wie funktioniert ein Comparator?

Der Comparator-Instanz werden zwei Objekte desselben Typs übergeben. Hier wird der Comparator-Instanz die Referenzen der beiden Objekte übergeben. In der Methode compare() der Comparator-Klasse wird der Vergleich dieser beiden Datenklassen implementiert.


7. Wie sieht ein Comparator aus?

Die Funktion compare() der Comparatoren ist definiert als:

public int compare(T o1, T o2);
view raw gistfile1.java hosted with ❤ by GitHub

7.1. Beispiel für einen Comparator:

7.1.1. Benutzte Datenklasse:

public class DataObject {
private String name;
private int age;
public DataObject(String name, nt age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
view raw gistfile2.java hosted with ❤ by GitHub

7.1.2. ein Attribut Sortierung

public class Comparator1 implements java.util.Comparator<DataObject> {
@Override
public int compare(DataObject o1, DataObject o2) {
if(o1 == null && o2 == null) return 0;
else if(o1 == null && o2 != null) return -1;
else if(o1 != null && o2 == null) return 1;
else return o1.getName().compareTo(o2.getName());
}
}
view raw gistfile3.java hosted with ❤ by GitHub

7.1.3. mehrfach Attribut Sortierung

public class Comparator2 implements java.util.Comparator<DataObject> {
@Override
public int compare(DataObject o1, DataObject o2) {
if(o1 == null && o2 == null) return 0;
else if(o1 == null && o2 != null) return -1;
else if(o1 != null && o2 == null) return 1;
else {
if(o1.getAge() > o2.getAge()) return 1;
else if(o1.getAge() < o2.getAge()) return -1;
else {
return o1.getName().compareTo(o2.getName());
}
}
}
}
view raw gistfile4.java hosted with ❤ by GitHub


8. Wie funktioniert ein Comparable?

Vergleicht Objekt O1 mit Objekt O2, indem die Referenz von Objekt O2 an die Methode compareTo() des Objekts O1 übergeben wird. Der Vergleich der beiden Objekte wird in der Methode compareTo() der Datenklasse bewerkstelligt.


9. Wie sieht ein Comparable aus?

Die Funktion compareTo() der Comparables ist definiert durch:

public int compareTo(T o);
view raw gistfile5.java hosted with ❤ by GitHub

9.1. Beispiel für einen Comparable:

9.1.1. ein Attribut sortierung

public class DataObject1 implements Comparable<DataObject1> {
private String name;
private int age;
public DataObject1(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(DataObject1 o) {
if(o == null) return -1;
else if(o.getName() == null && name == null) return 0;
else if(o.getName() != null && name == null) return -1;
else if(o.getName() == null && name != null) return 1;
else return name.compareTo(o.getName());
}
}
view raw gistfile6.java hosted with ❤ by GitHub

9.1.2. mehrfach Attribut sortierung

public class DataObject2 implements Comparable<DataObject2> {
private String name;
private int age;
public DataObject2(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(DataObject2 o) {
if(o == null) return -1;
else {
if(age > o.getAge()) return 1;
else if(age < o.getAge()) return -1;
else {
if(o.getName() == null && name == null) return 0;
else if(o.getName() != null && name == null) return -1;
else if(o.getName() == null && name != null) return 1;
else return name.compareTo(o.getName());
}
}
}
}
view raw gistfile7.java hosted with ❤ by GitHub


10. Wie wendet man Comparatoren und Comparables an?

Für das Sortieren von Listen wird die Klasse java.util.Collections verwendet. Diese enthält eine Static methode namens sort, welche in zwei varianten existiert.

  1. sort(List<T> list)
  2. sort(List<T> list, Comparator<? super T> c)


10.1. Anwendung von Comparatoren

List<DataObject> list = new LinkedList<>(){{
add(...);
add(...);
...
}};
Collections.sort(list,new Comparator1());
view raw gistfile8.java hosted with ❤ by GitHub
Die sort-Methode sortiert die übergebene Liste und nutzt als Vergleichsoperation die compare-Methode des Comparators.

10.2. Anwendung von Comparable

List<DataObject1> list = new LinkedList(){{
add(...);
add(...);
...
}};
Collections.sort(list);
view raw gistfile9.java hosted with ❤ by GitHub

Die sort-Methode verwendet an dieser Stelle die compareTo-Methode des Comparable-Interfaces als Vergleichsoperation.


Stand: 5. November 2013