Leitfaden zum Sortieren in Kotlin

Leitfaden zur Sortierung in Kotlin

1. Überblick

Kotlin baut mitextension methods auf dem Java Collection-Framework auf. Dies verbessert die Benutzerfreundlichkeit und Lesbarkeit erheblich, ohne dass Abhängigkeiten von Drittanbietern wieApache Commons oderGuava erforderlich sind.

In diesem Tutorial konzentrieren wir uns auf das Sortieren in Kotlin. Außerdem verwenden wir das Paketkotlin.comparisons, um komplexe Bestellregeln zu implementieren.

2. Eine Sammlung sortieren

Kotlin bietet mehrere Dienstprogramme, um das Sortieren von Sammlungen zu vereinfachen. Lassen Sie uns mehrere dieser Methoden erkunden.

2.1. Sort

The simplest way to sort a collection is to call the sort method. Diese Methode verwendet die natürliche Reihenfolge der Elemente. Außerdem wird standardmäßig in aufsteigender Richtung geordnet, sodass "a" vor "b" und "1" vor "2" steht:

val sortedValues = mutableListOf(1, 2, 7, 6, 5, 6)
sortedValues.sort()
println(sortedValues)

Und das Ergebnis des obigen Codes ist:

[1, 2, 5, 6, 6, 7]

Es ist wichtig zu beachten, dass wir eine veränderbare Sammlung verwendet haben. Der Grund ist, dassthe sort method will sort in-place. Wenn das Ergebnis als neue Liste zurückgegeben werden soll, müssen wir stattdessen nur die Methodesortedverwenden.

Darüber hinaus können wir die MethodensortDescending oderreverse zum Sortieren in absteigender Reihenfolge. verwenden

2.2. SortBy

Wenn wir nach bestimmten Eigenschaften eines bestimmten Objekts sortieren müssen, können wirsortBy. The sortBy method allows us to pass a selector function as an argument. verwenden. Die Auswahlfunktion empfängt das Objekt und sollte den Wert zurückgeben, nach dem wir sortieren möchten:

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortBy { it.second }
println(sortedValues)

Und das Ergebnis des obigen Codes ist:

[(1, a), (2, b), (7, c), (5, c), (6, d), (6, e)]

Auch hier muss die Sammlung veränderbar sein, da die MethodesortBydirekt sortiert wird. Wenn das Ergebnis als neue Liste zurückgegeben werden soll, müssen wir die MethodesortedByanstelle der MethodesortByverwenden.

Wie zuvor können wir für absteigende Reihenfolge die MethodensortByDescending oderreverse verwenden.

2.3. SortWith

Für eine erweiterte Verwendung (zum Beispiel um mehrere Regeln zu kombinieren) können wir die MethodesortWithverwenden.

Wir können einComparator-Objekt als Argument übergeben. In Kotlin gibt es mehrere Möglichkeiten,Comparator Objekte zu erstellen, und wir werden dies im nächsten Abschnitt behandeln:

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortWith(compareBy({it.second}, {it.first}))
println(sortedValues)

Und das Ergebnis des obigen Codes ist, dass sie nach Buchstaben und dann nach Zahlen sortiert sind:

[(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]

Da diesortWith die Sortierung direkt durchführen, müssen wir eine veränderbare Sammlung verwenden. Wenn das Ergebnis als neue Sammlung zurückgegeben werden soll, müssen wir die MethodesortedWith anstelle der MethodesortWith. verwenden

Für absteigende Reihenfolge können wir die Methodereverse verwenden oder alternativ die richtigenComparator definieren.

3. Vergleich

Kotlin enthält ein sehr nützliches Paket zum Erstellen einesComparator -kotlin.comparisons.  In den folgenden Abschnitten werden wir diskutieren:

  • Comparator Erstellung

  • Behandlung vonnull Werten

  • Reihenfolge umkehren

  • Comparator Regelerweiterung

3.1. Comparator Erstellung

Um die Erstellung unseresComparator, Kotlin zu vereinfachen, bietet sKotlin viele Factory-Methoden, um unseren Code aussagekräftiger zu machen.

Die einfachste verfügbare Factory vonComparatoristnaturalOrder().. Es sind keine Argumente erforderlich und die Reihenfolge ist standardmäßig aufsteigend:

val ascComparator = naturalOrder()

Für Objekte mit mehreren Eigenschaften können wir diecompareBy-Methode verwenden. Als Argumente geben wir eine variable Anzahl von Funktionen (Sortierregeln) an, die jeweils einComparable-Objekt zurückgeben. Diese Funktionen werden dann nacheinander aufgerufen, bis das resultierendeComparable-Objekt als ungleich ausgewertet wird oder bis alle Funktionen aufgerufen werden.

Im nächsten Beispiel wird der Wert vonit.first für Vergleiche verwendet, und nur wenn die Werte gleich sind, wirdit.second aufgerufen, um die Bindung zu lösen:

val complexComparator = compareBy>({it.first}, {it.second})

Erkunden Siekotlin.comparisons, um alle verfügbaren Fabriken zu entdecken.

3.2. Behandlung vonnull Werten

Eine einfache Möglichkeit, unsereComparator mit der Wertebehandlung vonnullzu verbessern, besteht darin, die MethodennullsFirst odernullsLast zu verwenden. Diese Methoden sortierennull-Werte an erster bzw. letzter Stelle:

val sortedValues = mutableListOf(1 to "a", 2 to null, 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortWith(nullsLast(compareBy { it.second }))
println(sortedValues)

Das Ergebnis des obigen Codes ist:

[(1, a), (7, c), (5, c), (6, d), (6, e), (2, null)]

Wir können sehen, dass der letzte Wert in der resultierenden Sammlung der mit dem Wert vonnullist.

3.3. Reihenfolge umkehren

Um die Reihenfolge umzukehren, können wir die MethodereverseOrder oder die Methodereversed. verwenden. Die erstere Methode hat keine Argumente und gibt eine absteigende Reihenfolge zurück. Die letztere Methode kann auf das ObjektComparatorangewendet werden und gibt das umgekehrte ObjektComparatorzurück.

Um einComparator in absteigender natürlicher Reihenfolge zu erstellen, können wir Folgendes tun:

reverseOrder()

3.4. Erweiterung der Komparatorregeln

Comparator Objekte können mit den imkotlin.comparable Paket verfügbarenthen Methoden kombiniert oder mit zusätzlichen Sortierregeln erweitert werden.

Erst wenn der erste Komparator gleich auswertet, wird der zweite Komparator verwendet.

Unsere Studentenliste enthält für jede Person ein Alter und einen Namen. Wir möchten, dass sie vom Jüngsten zum Ältesten sortiert werden und, wenn sie gleich alt sind, nach dem Namen absteigen:

val students = mutableListOf(21 to "Helen", 21 to "Tom", 20 to "Jim")

val ageComparator = compareBy> {it.first}
val ageAndNameComparator = ageComparator.thenByDescending {it.second}
println(students.sortedWith(ageAndNameComparator))

Das Ergebnis des obigen Codes ist:

[(20, Jim), (21, Tom), (21, Helen)]

4. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie die Methodensort,sortBy undsortWith verwendet werden, um Sammlungen in Kotlin zu sortieren.

Später haben wir auch das Paketkotlin.comparisonsverwendet, umComparator Objekte zu erstellen und sie mit zusätzlichen Sortierregeln zu erweitern.

Die Implementierung all dieser Beispiele und Snippets finden Sie inover on GitHub.