Vodič za sortiranje u Kotlinu

1. Pregled

Kotlin gradi na vrhu okvira Java Collection koristeći metode proširenja. Ovo dramatično poboljšava upotrebljivost i čitljivost bez potrebe nezavisnih ovisnosti kao što su Apache Commons ili Guava.

U ovom uputstvu usredotočit ćemo se na sortiranje u Kotlinu. Također ćemo koristiti kotlin.comusporedbe paket za primjenu složenih pravila naručivanja.

2. Sortiranje zbirke

Kotlin nudi više uslužnih programa za olakšavanje postupka sortiranja zbirki. Istražimo nekoliko ovih metoda.

2.1. Vrsta

Najjednostavniji način sortiranja zbirke je pozivanje vrsta metoda. Ova metoda koristit će prirodni poredak elemenata. Također, prema zadanim postavkama rasporedit će se u uzlaznom smjeru, tako da je "a" ispred "b", a "1" ispred "2":

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

A rezultat gornjeg koda je:

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

Važno je napomenuti da smo koristili promjenjivu kolekciju. Razlog je taj the vrsta metoda će sortirati na mjestu. Ako želimo da se rezultat vrati kao novi popis, onda samo trebamo koristiti razvrstano metoda umjesto toga.

Nadalje, možemo koristiti sortDescending ili obrnuti metode sortiranja u opadajućem redoslijedu.

2.2. Poredaj po

Ako trebamo sortirati prema određenim svojstvima određenog objekta, možemo koristiti poredaj The poredaj metoda omogućuje nam prosljeđivanje funkcije selektora kao argumenta. Funkcija selektora primit će objekt i trebala bi vratiti vrijednost na kojoj bismo željeli sortirati:

val sortedValues ​​= mutableListOf (1 do "a", 2 do "b", 7 do "c", 6 do "d", 5 do "c", 6 do "e") sortedValues.sortBy {it.second} println (sortirane vrijednosti)

A rezultat gornjeg koda je:

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

Opet, zbirka mora biti promjenjiva jer poredaj metoda će sortirati na mjestu. Ako želimo da se rezultat vrati kao novi popis, tada moramo koristiti sortiranoPo metoda umjesto poredaj metoda.

Kao i prije, za silazni poredak možemo koristiti sortByDescending ili obrnuti metode.

2.3. Poredaj sa

Za napredniju uporabu (na primjer za kombiniranje više pravila) možemo koristiti sortWith metoda.

Možemo proći a Usporednik objekt kao argument. U Kotlinu imamo više načina za stvaranje Usporednik objekata i to ćemo pokriti u sljedećem odjeljku:

val sortedValues ​​= mutableListOf (1 do "a", 2 do "b", 7 do "c", 6 do "d", 5 do "c", 6 do "e") sortedValues.sortWith (compareBy ({it. drugo}, {it.first})) println (sortedValues)

Rezultat gornjeg koda je da su razvrstani po slovima, a zatim po broju:

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

Jer sortWith izvršit će sortiranje na mjestu, trebamo koristiti promjenjivu kolekciju. Ako želimo da se rezultat vrati kao nova zbirka, tada moramo koristiti sortedWith metoda umjesto sortWith metoda.

Za silazni redoslijed možemo koristiti obrnuti metodom ili alternativno definirati pravo Usporednik.

3. Usporedba

Kotlin sadrži vrlo koristan paket za izgradnju a Usporednikkotlin.comusporedbe. U sljedećim ćemo odjeljcima razgovarati o:

  • Usporednik stvaranje
  • Rukovanje null vrijednosti
  • Obrtanje redoslijeda
  • Usporednik produženje pravila

3.1. Usporednik Stvaranje

Kako bismo pojednostavili stvaranje našeg Usporednik, Kotlin donosi mnoge tvorničke metode kako bi naš kôd učinio izražajnijim.

Najjednostavnije Usporednik tvornički dostupna je naturalOrder (). Nisu potrebni nikakvi argumenti, a redoslijed je prema uzlaznom porastu:

val ascComparator = naturalOrder ()

Za objekte s više svojstava možemo koristiti usporediBy metoda. Kao argumente dajemo promjenjivi broj funkcija (pravila sortiranja) koje će svaka vratiti a Usporedive objekt. Zatim će se te funkcije pozivati ​​uzastopno dok se ne dobiju Usporedive objekt procjenjuje da nije jednak ili dok se ne pozovu sve funkcije.

U sljedećem primjeru, to.prvi vrijednost se koristi za usporedbe i, samo kada su vrijednosti jednake, to.drugo bit će pozvani da prekinu neriješeno:

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

Slobodno istražujte kotlin.comusporedbe otkriti sve raspoložive tvornice.

3.2. Rukovanje null Vrijednosti

Jednostavan način za poboljšanje našeg Usporednik s null rukovanje vrijednostima je korištenje nullsFirst ili nullsPosljednje metode. Ove će se metode sortirati null vrijednosti na prvom ili posljednjem mjestu:

val sortedValues ​​= mutableListOf (1 na "a", 2 na nulu, 7 na "c", 6 na "d", 5 na "c", 6 na "e") sortedValues.sortWith (nullsLast (compareBy {it.second })) println (sortedValues)

Rezultat gornjeg koda bit će:

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

Možemo vidjeti da je zadnja vrijednost u rezultirajućoj zbirci ona sa null vrijednost.

3.3. Preokret Reda

Da bismo poništili redoslijed, možemo koristiti obrnuti redoslijed metoda ili obrnuto metoda. Prva metoda nema argumenata i vraća silazni poredak. Potonja se metoda može primijeniti na Usporednik objekt i vratit će svoj obrnuti Usporednik objekt.

Za izgradnju a Usporednik koristeći silazni prirodni poredak možemo učiniti:

obrnuti redoslijed()

3.4. Proširenje pravila za usporedbu

Usporednik objekti se mogu kombinirati ili proširiti s dodatnim pravilima sortiranja putem zatim metode dostupne u kotlin.porediv paket.

Tek kad se prva usporednica ocijeni jednakom, tada će se upotrijebiti druga usporednica.

Naš popis učenika sadrži dob i ime za svakog pojedinca. Želimo ih sortirati od najmlađih do najstarijih i, kad su istih godina, silazno prema imenu:

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

Rezultat gornjeg koda bit će:

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

4. Zaključak

U ovom smo brzom vodiču vidjeli kako se koristi vrsta, poredaj i sortWith metode radi sortiranja zbirki u Kotlinu.

Kasnije smo i mi koristili kotlin.comusporedbe paket za stvaranje Usporednik objekata i da ih poboljšaju dodatnim pravilima sortiranja.

Implementacija svih ovih primjera i isječaka može se naći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found