Ordenar una colección usando múltiples campos en Kotlin

David Mbochi Njonge 20 junio 2023
  1. Generar un Proyecto Kotlin
  2. Ordenar colección usando propiedades individuales
  3. Ordenar colección usando múltiples propiedades
  4. Conclusión
Ordenar una colección usando múltiples campos en Kotlin

La biblioteca de Kotlin proporciona diferentes formas en que el desarrollador puede aprovechar según el requisito. Este tutorial nos enseñará cómo ordenar una colección usando campos individuales y múltiples.

Generar un Proyecto Kotlin

Abra el entorno de desarrollo IntelliJ y seleccione Archivo > Nuevo > Proyecto. Ingrese el nombre del proyecto como kotlin-sortby, seleccione Kotlin en la sección de idioma y seleccione Intellij en la sección Build system.

Por último, pulsa el botón Crear para generar el proyecto. Cree un archivo llamado Main.kt en la carpeta src/main/kotlin y copie y pegue el siguiente código en el archivo.

Código:

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))
    )
}

En este código, hemos creado un método llamado fetchBooks() que devuelve una Lista de objetos de libro creados con la clase de datos Libro. Usamos esta lista en nuestros ejemplos para ver cómo podemos ordenar los libros según diferentes criterios.

Ordenar colección usando propiedades individuales

Copie y pegue los siguientes códigos de ejemplo en el archivo Main.kt después del método fetchBooks().

Utilice el método sortBy() para ordenar una colección

En el siguiente ejemplo, crearemos un método llamado usingSortBy() que usa el método sortBy() para ordenar nuestra lista creada previamente usando el campo yearPublished.

El método sortBy() es una función de extensión de la MutableList y no devuelve ningún valor. La función tiene una palabra clave crossinline antes de la función de selector que se le aplica, lo que significa que la función de selector no permite retornos no locales.

Tenga en cuenta que la función de selección utiliza la interfaz Comparable en segundo plano para ordenar los elementos de la lista.

Código:

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

fun main(){
    usingSortBy();
}

Producción :

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)

Utilice el método sortedBy() para ordenar una colección

El marco de las colecciones proporciona una alternativa al método sortBy() que nos permite devolver una nueva lista que no pudimos obtener en este ejemplo. Podemos utilizar el método sortedBy(), una función de extensión de la interfaz Iterable.

Código:

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

fun main(){
    usingSortedBy();
}

Producción :

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)

El método sortedBy() devuelve una lista que contiene los elementos ordenados mediante la función de selección, y podemos invocar el método forEach() en la lista devuelta para registrar los objetos en la consola.

Ordenar colección usando múltiples propiedades

Hemos visto cómo ordenar elementos usando un solo campo en ejemplos anteriores. Sin embargo, hay situaciones en las que el cliente puede querer ordenar en función de varios campos en una aplicación.

En esta sección, aprenderemos cómo realizar esta funcionalidad.

Utilice el método sortWith() para ordenar una colección

En este ejemplo, hemos creado un método llamado usingSortWith() que usa el método sortWith() para ordenar nuestra lista usando el nombre del libro seguido del año del libro.

El método sortWith() es una función de extensión de la MutableList y acepta cualquier argumento que devuelva un Comparador. Tenga en cuenta que este método no devuelve ningún valor.

Código:

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

fun main(){
    usingSortWith();
}

Hemos utilizado el método compareBy() como argumento para el método sortWith(). El método compareBy() devuelve un Comparador y se puede sobrecargar con más de una función de selección para ordenar la lista en función de diferentes propiedades.

La palabra clave vararg añadida antes de la definición de la función selectora indica que podemos pasar más de un argumento.

Producción :

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)

Utilice el método sortedWith() para ordenar una colección

El marco de las colecciones proporciona una alternativa al método sortWith() que nos permite devolver una nueva lista que contiene los elementos ordenados. Podemos usar el método sortedWith() para realizar esta funcionalidad.

El método sortedWith() es una función de extensión de la interfaz Iterable y acepta cualquier argumento que devuelva un Comparador.

Código:

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

fun main(){
    usingSortedWith();
}

Hemos utilizado el compareBy() que devuelve un Comparador como en el ejemplo anterior y lo hemos sobrecargado para ordenar la lista por nombre y año.

Producción :

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)

Conclusión

En este tutorial, hemos aprendido diferentes formas que podemos usar para ordenar una lista según los criterios deseados. Los enfoques que hemos cubierto incluyen el uso del método sortBy(), el método sortedBy(), el método sortWith() y el método sortedWith().

Tenga en cuenta que las otras dos estrategias de clasificación nos permiten ordenar una lista en orden descendente e incluyen sortByDescending() y 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