Sortieren Sie eine Sammlung mit mehreren Feldern in Kotlin

David Mbochi Njonge 20 Juni 2023
  1. Generieren Sie ein Kotlin-Projekt
  2. Sammlung nach individuellen Eigenschaften sortieren
  3. Sammlung mit mehreren Eigenschaften sortieren
  4. Abschluss
Sortieren Sie eine Sammlung mit mehreren Feldern in Kotlin

Die Kotlin-Bibliothek bietet verschiedene Möglichkeiten, die der Entwickler je nach Anforderung nutzen kann. In diesem Tutorial erfahren Sie, wie Sie eine Sammlung mit einzelnen und mehreren Feldern sortieren.

Generieren Sie ein Kotlin-Projekt

Öffnen Sie die IntelliJ-Entwicklungsumgebung und wählen Sie Datei > Neu > Projekt. Geben Sie den Projektnamen als kotlin-sortby ein, wählen Sie Kotlin im Sprachabschnitt und wählen Sie Intellij im Abschnitt System erstellen.

Drücken Sie zuletzt die Schaltfläche Erstellen, um das Projekt zu generieren. Erstellen Sie eine Datei namens Main.kt im Ordner src/main/kotlin und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.

Code:

import java.time.Year

data class Book(val id: Int,
                val name: String,
                val yearPublished: Year)

fun fetchBooks(): ArrayList<Book>{
    return arrayListOf(
        Book(1,"Java Arrays", Year.of(1984)),
        Book(2,"Python Arrays",Year.of(2021)),
        Book(3,"Pascal for loop",Year.of(2022)),
        Book(4,"Pascal Arrays",Year.of(2021)),
        Book(5,"Java for loop",Year.of(2022))
    )
}

In diesem Code haben wir eine Methode namens fetchBooks() erstellt, die eine Liste von Buchobjekten zurückgibt, die mit der Datenklasse Book erstellt wurden. Wir verwenden diese Liste in unseren Beispielen, um zu sehen, wie wir die Bücher nach verschiedenen Kriterien sortieren können.

Sammlung nach individuellen Eigenschaften sortieren

Kopieren Sie die folgenden Beispielcodes und fügen Sie sie nach der Methode fetchBooks() in die Datei Main.kt ein.

Verwenden Sie die sortBy()-Methode, um eine Sammlung zu sortieren

Im folgenden Beispiel erstellen wir eine Methode namens usingSortBy(), die die Methode sortBy() verwendet, um unsere zuvor erstellte Liste mit dem Feld yearPublished zu sortieren.

Die Methode sortBy() ist eine Erweiterungsfunktion der MutableList und liefert keinen Wert zurück. Die Funktion hat ein Schlüsselwort crossinline vor der Selektorfunktion, die darauf angewendet wird, was bedeutet, dass die Selektorfunktion keine nicht-lokalen Rückgaben zulässt.

Beachten Sie, dass die Selektor-Funktion hinter den Kulissen die Schnittstelle Vergleichbar verwendet, um die Elemente in der Liste zu sortieren.

Code:

fun usingSortBy(){
    val books = fetchBooks()
    books.sortBy(Book::yearPublished)
    books.forEach(::println);
}

fun main(){
    usingSortBy();
}

Ausgang:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=2, name=Python Arrays, yearPublished=2021)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=5, name=Java for loop, yearPublished=2022)

Verwenden Sie die sortedBy()-Methode, um eine Sammlung zu sortieren

Das Collections-Framework bietet eine Alternative zur sortBy()-Methode, die es uns ermöglicht, eine neue Liste zurückzugeben, die wir in diesem Beispiel nicht erhalten konnten. Wir können die Methode sortedBy() verwenden, eine Erweiterungsfunktion der Schnittstelle Iterable.

Code:

fun usingSortedBy(){
    fetchBooks().sortedBy(Book::yearPublished)
        .forEach(::println);
}

fun main(){
    usingSortedBy();
}

Ausgang:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=2, name=Python Arrays, yearPublished=2021)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=5, name=Java for loop, yearPublished=2022)

Die Methode sortedBy() gibt eine Liste zurück, die die Elemente enthält, die mit der Selektorfunktion sortiert wurden, und wir können die Methode forEach() für die zurückgegebene Liste aufrufen, um die Objekte in der Konsole zu protokollieren.

Sammlung mit mehreren Eigenschaften sortieren

Wir haben in den vorherigen Beispielen gesehen, wie Elemente mithilfe eines einzelnen Felds sortiert werden. Es gibt jedoch Situationen, in denen der Client möglicherweise basierend auf mehreren Feldern in einer Anwendung sortieren möchte.

In diesem Abschnitt erfahren Sie, wie Sie diese Funktionalität realisieren.

Verwenden Sie die sortWith()-Methode, um eine Sammlung zu sortieren

In diesem Beispiel haben wir eine Methode namens usingSortWith() erstellt, die die Methode sortWith() verwendet, um unsere Liste nach dem Namen des Buchs gefolgt vom Jahr des Buchs zu sortieren.

Die Methode sortWith() ist eine Erweiterungsfunktion der MutableList und akzeptiert jedes Argument, das einen Comparator zurückgibt. Beachten Sie, dass diese Methode keinen Wert zurückgibt.

Code:

fun usingSortWith(){
    val books = fetchBooks();
    books.sortWith(compareBy(Book::name, Book::yearPublished));
    books.forEach(::println);
}

fun main(){
    usingSortWith();
}

Wir haben die Methode compareBy() als Argument für die Methode sortWith() verwendet. Die Methode compareBy() gibt einen Comparator zurück und kann mit mehr als einer Selektorfunktion überladen werden, um die Liste nach verschiedenen Eigenschaften zu sortieren.

Das vor der Selektorfunktionsdefinition hinzugefügte Schlüsselwort vararg zeigt an, dass wir mehr als ein Argument übergeben können.

Ausgang:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=5, name=Java for loop, yearPublished=2022)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=2, name=Python Arrays, yearPublished=2021)

Verwenden Sie die sortedWith()-Methode, um eine Sammlung zu sortieren

Das Sammlungs-Framework bietet eine Alternative zur sortWith()-Methode, die es uns ermöglicht, eine neue Liste mit den sortierten Elementen zurückzugeben. Wir können die Methode sortedWith() verwenden, um diese Funktionalität zu realisieren.

Die Methode sortedWith() ist eine Erweiterungsfunktion der Schnittstelle Iterable und akzeptiert jedes Argument, das einen Comparator zurückgibt.

Code:

fun usingSortedWith(){
    fetchBooks().sortedWith(compareBy(Book::name, Book::yearPublished))
        .forEach(::println);
}

fun main(){
    usingSortedWith();
}

Wir haben den compareBy() verwendet, der einen Comparator zurückgibt, wie wir es im vorherigen Beispiel getan haben, und ihn überladen, um die Liste nach Name und Jahr zu sortieren.

Ausgang:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=5, name=Java for loop, yearPublished=2022)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=2, name=Python Arrays, yearPublished=2021)

Abschluss

In diesem Lernprogramm haben wir verschiedene Möglichkeiten kennengelernt, mit denen wir eine Liste nach gewünschten Kriterien sortieren können. Zu den Ansätzen, die wir behandelt haben, gehören die Verwendung der Methode sortBy(), die Verwendung der Methode sortedBy(), die Verwendung der Methode sortWith() und die Verwendung der Methode sortedWith().

Beachten Sie, dass die anderen beiden Sortierstrategien es uns ermöglichen, eine Liste in absteigender Reihenfolge zu sortieren, und sie beinhalten sortByDescending() und sortedByDescending().

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub