Sortierung von Sammlungen nach mehreren Feldern in Kotlin: 5 fatale Fehler

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum „einfache“ Sortierung in Kotlin den Code zerstört?

\n

Hallo, Kollege! Wenn du jemals in Kotlin geschrieben und versucht hast, eine Liste von Aufgaben zuerst nach Datum und dann nach Priorität zu sortieren, bist du sicherlich auf eine Situation gestoßen, in der das Ergebnis wie eine zufällige Ansammlung aussieht. Du bist nicht allein – die Frage „Sort collection by multiple fields in Kotlin“ hat tausende Aufrufe auf Stack Overflow gesammelt. Es scheint einfach, oder? Aber der Teufel steckt, wie immer, im Detail.

\n

In diesem Artikel analysieren wir die Top-Fehler bei der Sortierung nach mehreren Feldern in Kotlin, die selbst erfahrene Entwickler machen. Du erfährst, wie sortedWith funktioniert, warum compareBy und thenBy deine besten Freunde sind und wie du keine Daten durch null verlierst. Los geht's!

\n\n

Fehler Nr. 1: Sortierung wie in Java – manuell mit Comparator

\n

Kotlin ist nicht Java. Aber viele, die aus der Java-Welt kommen, schreiben:

\n
val list = listOf(\n    User("Alice", 25),\n    User("Bob", 20),\n    User("Charlie", 25)\n)\n\nval sorted = list.sortedWith(Comparator { a, b ->\n    val ageCompare = a.age.compareTo(b.age)\n    if (ageCompare != 0) ageCompare else a.name.compareTo(b.name)\n})\n
\n

Ja, das funktioniert. Aber es ist schrecklich lesbar, und du verlierst leicht den Überblick in den if-else-Ketten. Kotlin bietet eine elegante Möglichkeit – Comparator-Funktionen.

\n

Wie macht man es richtig?

\n
val sorted = list.sortedWith(compareBy<User> { it.age }.thenBy { it.name })\n
\n

Kurz, klar, ohne überflüssige Logik. compareBy erstellt den primären Comparator, und thenBy fügt sekundäre Felder hinzu. Das ist die Sortierung nach mehreren Feldern in Kotlin in ihrer idealen Form.

\n\n

Fehler Nr. 2: Ignorieren von null bei der Sortierung

\n

Angenommen, wir haben eine Liste von Aufgaben, bei denen deadline null sein kann. Wenn du einfach schreibst:

\n
tasks.sortedBy { it.deadline }\n
\n

…erhältst du eine NullPointerException. Kotlin ist streng mit null, und das ist großartig. Aber was, wenn null in Ordnung ist?

\n

Lösung: nullsFirst / nullsLast

\n

Verwende spezielle Wrapper:

\n
val sorted = tasks.sortedWith(\n    compareBy<Task>(nullsLast()) { it.deadline }\n        .thenBy { it.priority }\n)\n
\n

Hier platziert nullsLast() alle null-Daten ans Ende der Liste. Es gibt auch nullsFirst() – umgekehrt. Das löst das Problem, und deine Sortierung von Kotlin-Sammlungen wird sicher.

\n\n

Fehler Nr. 3: Verwechslung von sortedBy und sortedWith

\n

Viele Anfänger schreiben:

\n
list.sortedBy { it.age }.sortedBy { it.name }\n
\n

Und wundern sich, dass die Sortierung nach Namen die Sortierung nach Alter „überschreibt“. sortedBy erstellt jedes Mal eine neue Liste und sortiert nur nach einem Feld. Der letzte Aufruf ist der wichtigste.

\n

Wie behebt man das?

\n

Verwende sortedWith mit einer compareBy-Kette:

\n
list.sortedWith(compareBy({ it.age }, { it.name }))\n
\n

Oder die mehrzeilige Variante für komplexe Logik:

\n
list.sortedWith(compareBy<Person> { it.age }.thenByDescending { it.name })\n
\n

Merke dir: Ein Aufruf von sortedWith – eine Sortierung nach mehreren Feldern.

\n\n

Fehler Nr. 4: Sortierung in umgekehrter Reihenfolge – an der falschen Stelle

\n

Manchmal muss man nach aufsteigendem Alter, aber absteigendem Namen sortieren. Typischer Fehler:

\n
list.sortedByDescending { it.age }.sortedBy { it.name }\n
\n

Wieder das gleiche Problem – die zweite Sortierung zerstört die erste. Der richtige Ansatz:

\n
val sorted = list.sortedWith(\n    compareBy<Person> { it.age }\n        .thenByDescending { it.name }\n)\n
\n

Oder für volle Kontrolle:

\n
val sorted = list.sortedWith(\n    compareBy(Person::age).thenByDescending(Person::name)\n)\n<                

Blogs

Buchempfehlungen