Anleitung zum Sortieren in Kotlin

1. Übersicht

Kotlin baut mithilfe von Erweiterungsmethoden auf dem Java Collection-Framework auf. Dies verbessert die Benutzerfreundlichkeit und Lesbarkeit erheblich, ohne dass Abhängigkeiten von Drittanbietern wie Apache Commons oder Guava erforderlich sind.

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

2. Sortieren einer Sammlung

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

2.1. Sortieren

Der einfachste Weg, eine Sammlung zu sortieren, besteht darin, die Sortiermethode aufzurufen . 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 dafür ist, dass die Sortiermethode direkt sortiert wird . Wenn das Ergebnis als neue Liste zurückgegeben werden soll, müssen wir stattdessen nur die sortierte Methode verwenden.

Darüber hinaus können wir die sortDescending- oder die umgekehrte Methode zum Sortieren in absteigender Reihenfolge verwenden .

2.2. Sortieren nach

Wenn wir nach bestimmten Eigenschaften eines bestimmten Objekts sortieren müssen, können wir sortBy verwenden. Mit der sortBy- Methode können wir eine Auswahlfunktion als Argument übergeben. Die Auswahlfunktion empfängt das Objekt und sollte den Wert zurückgeben, nach dem sortiert werden soll:

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 sortBy- Methode direkt sortiert wird. Wenn das Ergebnis als neue Liste zurückgegeben werden soll, müssen wir die sortedBy- Methode anstelle der sortBy- Methode verwenden.

Wie zuvor können wir für absteigende Reihenfolge die sortByDescending- oder die umgekehrte Methode verwenden.

2.3. SortWith

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

Wir können ein Comparator- Objekt als Argument übergeben. In Kotlin gibt es mehrere Möglichkeiten, Komparatorobjekte 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)

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 sortWith die Sortierung an Ort und Stelle vornimmt , müssen wir eine veränderbare Sammlung verwenden. Wenn das Ergebnis als neue Auflistung zurückgegeben werden soll, müssen wir die sortedWith- Methode anstelle der sortWith- Methode verwenden .

Für absteigende Reihenfolge können wir die umgekehrte Methode verwenden oder alternativ den richtigen Komparator definieren .

3. Vergleich

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

  • Komparator Schaffung
  • Der Umgang mit null Werten
  • Reihenfolge umkehren
  • Erweiterung der Komparatorregeln

3.1. Komparator Creation

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

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

val ascComparator = naturalOrder()

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

Im nächsten Beispiel ist es . Der erste Wert wird für Vergleiche verwendet. Nur wenn die Werte gleich sind, wird it.second aufgerufen, um die Bindung zu lösen:

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

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

3.2. Handhabung von null Values

Eine einfache Möglichkeit, unseren Komparator mit der Behandlung von Nullwerten zu verbessern, ist die Verwendung der Methoden nullsFirst oder nullsLast . Diese Methoden sortieren Nullwerte 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 Wert Null ist.

3.3. Bestellung umkehren

To reverse the order, we can use the reverseOrder method or the reversed method. The former method has no arguments and returns a descending order. The latter method can be applied on a Comparator object and it will return its reversed Comparator object.

To build a Comparator using descending natural order we can do:

reverseOrder()

3.4. Comparator Rules Extension

Comparator objects can be combined or extended with additional sorting rules via the then methods available in kotlin.comparable package.

Only when the first comparator evaluates to equal, the second comparator will then be used.

Unsere Studentenliste enthält ein Alter und einen Namen für jede Person. 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 Methoden sort , sortBy und sortWith verwendet werden, um Sammlungen in Kotlin zu sortieren.

Später haben wir auch das Paket kotlin.comparisons verwendet , um Comparator- Objekte zu erstellen und sie mit zusätzlichen Sortierregeln zu erweitern.

Die Implementierung all dieser Beispiele und Snippets finden Sie auf GitHub.