Freitag, 9. August 2019

Das größte und kleinste Element in einer Liste finden - ohne Schleife

Es kommt gar nicht so selten vor, dass man in einer Liste das größte oder das kleinste Element finden möchte. Stellen wir uns mal diese Liste vor: 4, 3, 6, 99, -44, 5. Wenn wir nun 99 als das größte Element bestimmen wollten, müssten wir mit einer for-Schleife durch diese Liste laufen und einen kleinen Algorithmus bauen, um das Maximum zu bestimmen. Aber es geht auch einfacher, dank der Klasse Collections.

Diese Werkzeugklasse hat nämlich zwei tolle Methoden: min() und max(). Betrachten wir mal ein kleines Beispiel.

List<Integer> myNumbers = Arrays.asList(4, 3, 6, 99, -44, 5);
int min = Collections.min(myNumbers);
int max = Collections.max(myNumbers);
System.out.println("Kleinste Zahl: " + min);
System.out.println("Größte Zahl: " + max);



Sie sehen, dass ich keine Schleifen-Konstrukte mehr programmiert habe. Diese beiden Methoden sind zwei nützliche kleine Methoden der Werkzeugklasse Collections. Beide Methoden existieren jetzt aber noch einmal in einer überladenen Version. Betrachten wir auch dafür mal ein Beispiel:

List<String> cities = Arrays.asList("Augsburg", "Saarbrücken", "Koblenz", "berlin");
String minCity = Collections.min(cities);
String maxCity = Collections.max(cities);
System.out.println("Min Stadt: " + minCity);
System.out.println("Max Stadt: " + maxCity);



Wenn wir das Beispiel ausführen, erhalten wir ein interessantes und vielleicht auch unerwartetes Ergebnis, denn berlin wird als Maximum der Städte ausgegeben uns nicht Saarbrücken, was wir bei einer lexikographischen Ordnung hätten erwarten können, denn "S" kommt nun einmal nach "B". Hier ist es wichtig, dass wir Strings sortieren. Und bei Strings werden zuerst die Großbuchstaben miteinander verglichen, dann die Kleinbuchstaben. Würde in der Liste Berlin statt berlin stehen, wäre tatsächlich Saarbrücken das Ergebnis gewesen.

Aber was, wenn wir nun das "richtige" Minimum oder Maximum haben möchten, also unabhängig von der Groß- und Kleinschreibung? Oder wenn wir von noch komplexeren Objekten das Minimum oder Maximum bestimmen möchten? Und genau an dieser Stelle kommen die überladenen Methoden ins Spiel.

Denn diese erwarten als zweiten Parameter einen Comparator. Das nächste Beispiel zeigt nun die Minimum- und Maximum-Suche ohne Beachtung der Groß- und Kleinschreibung.

List<String> cities = Arrays.asList("augsburg", "Saarbrücken", "Koblenz", "berlin");
String minCity = Collections.min(cities, (b,a) ->
    b.toLowerCase().compareTo(a.toLowerCase()));
String maxCity = Collections.max(cities, (a,b) ->
    a.toLowerCase().compareTo(b.toLowerCase()));
System.out.println("Min Stadt: " + minCity);
System.out.println("Max Stadt: " + maxCity);


In diesem Beispiel habe ich die Comparatoren mit Lambda-Ausdrücken umgesetzt. Sie sehen, dass Sie auf diese Art beliebig komplexe Vergleichsausdrücke mit beliebig komplexen Objekten ausführen können.

Keine Kommentare:

Kommentar veröffentlichen