Code :
1 | List<String> liste = new ArrayList<String>(); |
Die Klasse ArrayList implementiert die Methode add(), welches das Hinzufügen von Objekten erlaubt, also für die liste:
Code :
1 2 | liste.add("Hallo");
liste.add("Welt"); |
Code :
1 | Collections.sort(liste); |
Was aber, wenn man eigene Objekte mit mehreren Feldern sortieren will? Die JVM kann natürlich nicht wissen, nach welchem Feld sortiert werden soll. Deshalb muss die eigene Klasse das Interface Comparable implementieren resp. deren Methode compareTo(), welche angibt, nach was sortiert werden soll. Angenommen es gibt eine Klasse Auto mit den Feldern Marke und Inverkehrsetzung und die Sortierung soll nach der Marke vorgenommen werden, dann kann die Klasse Auto wie folgt aussehen:
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class Auto implements Comparable<Auto>{
private String marke;
private int inv;
public Auto(String m, int i) {
this.marke = m;
this.inv = i;
}
public String getMarke() {
return this.marke;
}
public String toString() {
return this.marke + " (" + this.inv + ")";
}
@Override
public int compareTo(Auto auto) {
return this.marke.compareTo(auto.getMarke());
}
} |
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class AutoListeBeispiel {
public static void main(String[] args) {
List<Auto> autos = new ArrayList<Auto>();
autos.add(new Auto("Mercedes", 2007));
autos.add(new Auto("Audi A8", 2010));
Collections.sort(autos);
for (Auto a : autos) {
System.out.println(a);
}
}
} |
Audi A8 (2010)
Mercedes (2007)
Mercedes (2007)
Was aber, wenn die Klasse nach unterschiedlichen Feldern sortiert werden muss? Hier kommt das Interface Comparator ins Spiel.
Der aufmerksame Leser wird bemerkt haben, dass mit Comparable nur ein Feld der eigenen Klasse sortiert werden kann. Dies, weil die Methodensignatur compareTo(Object anotherObject) lautet und sich der Vergleich mit this d.h. mit dem eigenen Objekt durchgeführt werden muss. Der return Wert von
Code :
1 | return this.marke.compareTo(auto.getMarke()) |
0 falls this.marke = auto.getMarke()
oder positiv falls this.marke > auto.getMarke()
Statt einer aufsteigenden kann man eine absteigende Sortierung durchführen, wenn man zuerst das auto.getMarke() mit this.marke vergleicht.
Nun zum eigentlichen Thema. Nehmen wir an, wir möchten nach Automarke oder nach Inverkehrsetzung sortieren. Hierzu braucht die Klasse Auto nicht mehr das Interface Comparable zu implementieren. Damit wir ausserhalb der Klasse Auto auf das Feld inv zugreifen können, fügen wir der Klasse Auto zuerst eine Gettermethode getInv() hinzu. Ebenfalls wurde die Methode toString() überschrieben, so dass beim Aufruf die Fahrzeugmarke sowie das Jahr der Inverkehrssetzung in Klammern zurückgeliefert wird.
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Auto {
private String marke;
private int inv;
public Auto(String m, int i) {
this.marke = m;
this.inv = i;
}
public String getMarke() {
return this.marke;
}
public int getInv() {
return this.inv;
}
public String toString() {
return this.marke + " (" + this.inv + ")";
}
} |
Code :
1 2 3 4 5 6 7 8 9 | import java.util.Comparator;
public class SortMarke implements Comparator<Auto>{
@Override
public int compare(Auto a1, Auto a2) {
return a1.getMarke().compareTo(a2.getMarke());
}
} |
Code :
1 2 3 4 5 6 7 8 9 | import java.util.Comparator;
public class SortInv implements Comparator<Auto>{
@Override
public int compare(Auto a1, Auto a2) {
return a1.getInv() - a2.getInv();
}
} |
Nach dem Return wird hier nicht mehr mit compareTo verglichen, sondern die Zahl von a2 von a1 substrahiert. Dies ergibt dasselbe Ergebnis wie oben gezeigt: falls a1.getInv() < f2.getInv() dann gebe ein negativer Wert zurück etc.
Die Sortierung nach beliebigen Feldern hat Programmieraufwand verursacht, dafür ist der Aufruf ziemlich einfach. Das folgende Programm implementiert die Methode main(), erzeugt zwei Fahrzeuge, sortiert nach Marke und gibt die Ergebnisse aus, sortiert nach Jahr der Inverkehrssetzung und gibt die Ergebnisse aus:
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class AutoListeBeispiel {
public static void main(String[] args) {
List<Auto> autos = new ArrayList<Auto>();
autos.add(new Auto("Mercedes", 2007));
autos.add(new Auto("Audi A8", 2010));
Collections.sort(autos, new SortMarke());
System.out.println("Sortierung nach Fahrzeugmarke:");
for (Auto a : autos) {
System.out.println(a);
}
Collections.sort(autos, new SortInv());
System.out.println("\nSortierung nach Jahr der Inverkehrssetzung:");
for (Auto a : autos) {
System.out.println(a);
}
}
} |
Sortierung nach Fahrzeugmarke:
Audi A8 (2010)
Mercedes (2007)
Sortierung nach Jahr der Inverkehrssetzung:
Mercedes (2007)
Audi A8 (2010)
Audi A8 (2010)
Mercedes (2007)
Sortierung nach Jahr der Inverkehrssetzung:
Mercedes (2007)
Audi A8 (2010)
java AutoListeBeispiel
Bitte auf Gross- bzw. Kleinschreibung achten, da Java in Groß-/Kleinschreibung unterscheidet!
Möchte man die Liste mit den Autos in absteigender Reihefolge sortieren, genügt dieser Aufruf:
Collections.sort(autos, Collections.reverseOrder(new SortMarke()));




Bereiche
Kategorien
Forum - Programming





tutorials.de-Systemmitteilung