Guida all'ordinamento in Kotlin

1. Panoramica

Kotlin si basa sul framework Java Collection utilizzando metodi di estensione. Ciò migliora notevolmente l'usabilità e la leggibilità senza la necessità di dipendenze di terze parti come Apache Commons o Guava.

In questo tutorial, ci concentreremo sull'ordinamento in Kotlin. Inoltre, utilizzeremo il pacchetto kotlin.comparisons per implementare regole di ordinamento complesse.

2. Ordinamento di una raccolta

Kotlin fornisce più utilità per semplificare il processo di ordinamento delle raccolte. Esploriamo molti di questi metodi.

2.1. Ordinare

Il modo più semplice per ordinare una raccolta è chiamare il metodo di ordinamento . Questo metodo utilizzerà l'ordine naturale degli elementi. Inoltre, ordinerà in direzione crescente per impostazione predefinita, quindi "a" è prima di "b" e "1" è prima di "2":

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

E il risultato del codice sopra è:

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

È importante notare che abbiamo utilizzato una raccolta modificabile. Il motivo è che il metodo di ordinamento ordinerà sul posto . Se vogliamo che il risultato venga restituito come un nuovo elenco, dobbiamo solo utilizzare il metodo ordinato .

Inoltre, possiamo utilizzare i metodi sortDescending o reverse per l'ordinamento in ordine decrescente .

2.2. Ordina per

Se abbiamo bisogno di ordinare per proprietà specifiche di un dato oggetto, possiamo usare sortBy. Il metodo sortBy ci consente di passare una funzione selettore come argomento. La funzione selector riceverà l'oggetto e dovrebbe restituire il valore su cui vorremmo ordinare:

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)

E il risultato del codice sopra è:

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

Anche in questo caso, la raccolta deve essere modificabile perché il metodo sortBy eseguirà l'ordinamento sul posto. Se vogliamo che il risultato venga restituito come una nuova lista, allora dobbiamo usare il metodo SortBy invece del metodo sortBy .

Come prima, per l'ordine decrescente, possiamo usare i metodi sortByDescending o reverse .

2.3. SortWith

Per un utilizzo più avanzato (per combinare più regole, ad esempio), possiamo utilizzare il metodo sortWith .

Possiamo passare un oggetto Comparator come argomento. In Kotlin abbiamo diversi modi per creare oggetti Comparator e ne parleremo nella prossima sezione:

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)

E il risultato del codice sopra è che sono ordinati per lettera e poi per numero:

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

Poiché sortWith eseguirà l'ordinamento sul posto, è necessario utilizzare una raccolta modificabile. Se vogliamo che il risultato venga restituito come una nuova raccolta, dobbiamo utilizzare il metodo SortWith invece del metodo sortWith .

Per l'ordine decrescente, possiamo usare il metodo inverso o in alternativa definire il giusto Comparatore .

3. Confronto

Kotlin contiene un pacchetto molto utile per creare un comparatore : kotlin.comparisons. Nelle sezioni seguenti, discuteremo:

  • Creazione di comparatori
  • Gestione dei valori nulli
  • Inversione dell'ordine
  • Estensione regole comparatore

3.1. Creazione del comparatore

Al fine di semplificare la creazione del nostro comparatore, Kotlin offre molti metodi di fabbrica per rendere il nostro codice più espressivo.

La fabbrica di comparatori più semplice disponibile è naturalOrder () . Non sono necessari argomenti e l'ordine è crescente per impostazione predefinita:

val ascComparator = naturalOrder()

Per oggetti con più proprietà, possiamo utilizzare il metodo compareBy . Come argomenti, diamo un numero variabile di funzioni (regole di ordinamento) che restituiranno ciascuna un oggetto Comparable . Quindi, quelle funzioni verranno chiamate in sequenza fino a quando l' oggetto Comparable risultante non verrà valutato come non uguale o finché non verranno chiamate tutte le funzioni.

Nel prossimo esempio, it . il primo valore viene utilizzato per i confronti e, solo quando i valori sono uguali, verrà chiamato it.second per rompere il pareggio:

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

Sentiti libero di esplorare kotlin.comparisons per scoprire tutte le fabbriche disponibili.

3.2. Gestione dei valori nulli

Un modo semplice per migliorare il nostro comparatore con la gestione dei valori nulli è utilizzare i metodi nullsFirst o nullsLast . Questi metodi ordineranno i valori nulli rispettivamente al primo o all'ultimo posto:

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)

Il risultato del codice precedente sarà:

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

Possiamo vedere che l'ultimo valore nella raccolta risultante è quello con valore nullo .

3.3. Invertire l'ordine

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.

Il nostro elenco di studenti contiene un'età e un nome per ogni individuo. Li vogliamo ordinati dal più giovane al più vecchio e, quando hanno la stessa età, decrescente in base al nome:

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

Il risultato del codice precedente sarà:

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

4. Conclusione

In questo breve tutorial, abbiamo visto come utilizzare i metodi sort , sortBy e sortWith per ordinare le raccolte in Kotlin.

Successivamente, abbiamo anche utilizzato il pacchetto kotlin.comparisons per creare oggetti Comparator e per migliorarli con regole di ordinamento aggiuntive.

L'implementazione di tutti questi esempi e frammenti può essere trovata su GitHub.