Gids voor sorteren in Kotlin

1. Overzicht

Kotlin bouwt voort op het Java Collection-framework met behulp van uitbreidingsmethoden. Dit verbetert de bruikbaarheid en leesbaarheid aanzienlijk zonder de noodzaak van afhankelijkheden van derden, zoals Apache Commons of Guava.

In deze tutorial zullen we ons concentreren op sorteren in Kotlin. We gebruiken ook de kotlin.com parisons pakket om complexe ordeningsregels te implementeren.

2. Een collectie sorteren

Kotlin biedt meerdere hulpprogramma's om het sorteren van collecties gemakkelijker te maken. Laten we een aantal van deze methoden onderzoeken.

2.1. Soort

De eenvoudigste manier om een ​​verzameling te sorteren, is door de soort methode. Deze methode gebruikt de natuurlijke volgorde van de elementen. Bovendien wordt standaard in oplopende richting geordend, dus ‘a 'staat voor‘ b' en ‘1 'is voor‘ 2':

waarde gesorteerdValues ​​= mutableListOf (1, 2, 7, 6, 5, 6) gesorteerdeValues.sort () println (gesorteerdeValues)

En het resultaat van de bovenstaande code is:

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

Het is belangrijk op te merken dat we een veranderlijke verzameling hebben gebruikt. De reden is dat de soort methode wordt op zijn plaats gesorteerd. Als we willen dat het resultaat wordt geretourneerd als een nieuwe lijst, hoeven we alleen de gesorteerd methode in plaats daarvan.

Verder kunnen we de sortAflopend of omgekeerde methoden om in aflopende volgorde te sorteren.

2.2. Sorteer op

Als we moeten sorteren op specifieke eigenschappen van een bepaald object, kunnen we sorteer op. De sorteer op methode stelt ons in staat om een ​​selectorfunctie als argument door te geven. De selector-functie ontvangt het object en moet de waarde retourneren waarop we willen sorteren:

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

En het resultaat van de bovenstaande code is:

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

Nogmaals, de verzameling moet veranderbaar zijn omdat de sorteer op methode wordt op zijn plaats gesorteerd. Als we willen dat het resultaat wordt geretourneerd als een nieuwe lijst, moeten we de gesorteerd door methode in plaats van de sorteer op methode.

Net als voorheen kunnen we voor aflopende volgorde de sortByDescending of omgekeerde methoden.

2.3. Sorteren met

Voor een meer geavanceerd gebruik (bijvoorbeeld om meerdere regels te combineren), kunnen we de sortMet methode.

We kunnen een Comparator object als argument. In Kotlin hebben we meerdere manieren om te creëren Comparator objecten en we zullen dat in de volgende sectie behandelen:

val sortValues ​​= mutableListOf (1 tot "a", 2 tot "b", 7 tot "c", 6 tot "d", 5 tot "c", 6 tot "e") gesorteerdValues.sortWith (CompareBy ({it. second}, {it.first})) println (gesorteerdeValues)

En het resultaat van de bovenstaande code is dat ze worden gesorteerd op letter en vervolgens op nummer:

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

Omdat de sortMet zal het sorteren ter plaatse doen, we hebben een veranderlijke verzameling nodig. Als we willen dat het resultaat wordt geretourneerd als een nieuwe verzameling, moeten we de gesorteerd met methode in plaats van de sorteren met methode.

Voor aflopende volgorde kunnen we de omgekeerde methode of definieer als alternatief het recht Comparator.

3. Vergelijking

Kotlin bevat een zeer handig pakket om een Comparatorkotlin.com parisons. In de volgende secties bespreken we:

  • Comparator creatie
  • Afhandeling van nul waarden
  • De bestelling omdraaien
  • Comparator regels extensie

3.1. Comparator Creatie

Om de oprichting van onze Comparator, Kotlin biedt veel fabrieksmethoden om onze code expressiever te maken.

De makkelijkste Comparator fabriek beschikbaar is natuurlijke orde(). Er zijn geen argumenten nodig en de volgorde is standaard oplopend:

val ascComparator = naturalOrder ()

Voor objecten met meerdere eigenschappen kunnen we de vergelijkBy methode. Als argumenten geven we een variabel aantal functies (sorteerregels) die elk een Vergelijkbaar voorwerp. Vervolgens worden die functies opeenvolgend aangeroepen tot het resulterende Vergelijkbaar object evalueert als niet gelijk of totdat alle functies zijn aangeroepen.

In het volgende voorbeeld het.eerste waarde wordt gebruikt voor vergelijkingen en, alleen als waarden gelijk zijn, it.tweede zal worden geroepen om de gelijkspel te doorbreken:

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

Voel je vrij om te verkennen kotlin.com parisons om alle beschikbare fabrieken te ontdekken.

3.2. Afhandeling van nul Waarden

Een eenvoudige manier om onze Comparator met nul waardeafhandeling is het gebruik van de nulls Eerste of nulls Laatste methoden. Deze methoden zullen sorteren nul waarden op respectievelijk de eerste of de laatste plaats:

val sortValues ​​= mutableListOf (1 tot "a", 2 tot null, 7 tot "c", 6 tot "d", 5 tot "c", 6 tot "e") sortValues.sortWith (nullsLast (vergelijkBy {it.seconde })) println (gesorteerdeValues)

Het resultaat van de bovenstaande code is:

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

We kunnen zien dat de laatste waarde in de resulterende verzameling de waarde is met nul waarde.

3.3. De volgorde omkeren

Om de volgorde om te draaien, kunnen we de omgekeerde volgorde methode of de omgekeerd methode. De eerste methode heeft geen argumenten en retourneert een aflopende volgorde. De laatste methode kan worden toegepast op een Comparator object en het zal zijn omgekeerd teruggeven Comparator voorwerp.

Om een Comparator in aflopende natuurlijke volgorde kunnen we doen:

omgekeerde volgorde()

3.4. Extensie voor vergelijkingsregels

Comparator objecten kunnen worden gecombineerd of uitgebreid met aanvullende sorteerregels via de dan methoden beschikbaar in kotlin. gelijkenis pakket.

Pas als de eerste comparator als gelijk evalueert, wordt de tweede comparator gebruikt.

Onze lijst met studenten bevat een leeftijd en een naam voor elk individu. We willen ze sorteren van jong naar oud en, als ze even oud zijn, aflopend op basis van de naam:

val students = mutableListOf (21 tot "Helen", 21 tot "Tom", 20 tot "Jim") val ageComparator = CompareBy {it.first} val ageAndNameComparator = ageComparator.thenByDescending {it.second} println (students.sortedWith (ageAndNameComparator))

Het resultaat van de bovenstaande code is:

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

4. Conclusie

In deze korte tutorial hebben we gezien hoe we de soort, sorteer op en sorteren met methoden om verzamelingen in Kotlin te sorteren.

Later hebben we ook gebruikt kotlin.com parisons pakket om te maken Comparator objecten en om ze te verfraaien met aanvullende sorteerregels.

De implementatie van al deze voorbeelden en fragmenten is te vinden op GitHub.