Ръководство за сортиране в Kotlin

1. Общ преглед

Kotlin изгражда върху рамката на Java Collection, използвайки методи за разширение. Това значително подобрява използваемостта и четливостта, без да са необходими зависимости на трети страни като Apache Commons или Guava.

В този урок ще се съсредоточим върху сортирането в Kotlin. Също така ще използваме пакета kotlin.comparisons, за да приложим сложни правила за подреждане.

2. Сортиране на колекция

Kotlin предоставя множество помощни програми, за да улесни процеса на сортиране на колекции. Нека разгледаме няколко от тези методи.

2.1. Вид

Най-простият начин за сортиране на колекция е да се извика методът за сортиране . Този метод ще използва естествения ред на елементите. Освен това по подразбиране ще се нарежда във възходяща посока, така че 'a' е пред 'b' и '1' е пред '2':

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

И резултатът от горния код е:

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

Важно е да се отбележи, че сме използвали колекция, която се променя. Причината е, че методът на сортиране ще сортира на място . Ако искаме резултатът да се върне като нов списък, тогава просто трябва да използваме сортирания метод.

Освен това можем да използваме методите sortDescending или reverse за сортиране в низходящ ред .

2.2. SortBy

Ако трябва да сортираме по специфични свойства на даден обект, можем да използваме sortBy. Методът sortBy ни позволява да предадем селекторна функция като аргумент. Функцията селектор ще получи обекта и трябва да върне стойността, по която бихме искали да сортираме:

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)

И резултатът от горния код е:

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

Отново колекцията трябва да бъде променлива, защото методът sortBy ще сортира на място. Ако искаме резултатът да бъде върнат като нов списък, тогава трябва да използваме метода sortedBy вместо метода sortBy .

Както и преди, за низходящ ред можем да използваме методите sortByDescending или обратното .

2.3. SortWith

За по-усъвършенствано използване (например за комбиниране на множество правила) можем да използваме метода sortWith .

Можем да предадем обект Comparator като аргумент. В Kotlin имаме няколко начина за създаване на обекти за сравнение и ще разгледаме това в следващия раздел:

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)

И резултатът от горния код е, че те са сортирани по буква и след това по номер:

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

Тъй като sortWith ще извърши сортирането на място, трябва да използваме променяща се колекция. Ако искаме резултатът да бъде върнат като нова колекция, тогава трябва да използваме метода sortedWith вместо метода sortWith .

За низходящ ред можем да използваме обратния метод или алтернативно да дефинираме правилния компаратор .

3. Сравнение

Kotlin съдържа много полезен пакет за изграждане на Comparator - kotlin.comparisons. В следващите раздели ще обсъдим:

  • Създаване на компаратор
  • Обработка на нулеви стойности
  • Обръщане на реда
  • Разширение на правилата за сравнение

3.1. Създаване на компаратор

За да опрости създаването на нашия Comparator, Kotlin предлага много фабрични методи, за да направи нашия код по-изразителен.

Най-простият наличен завод за сравнение е naturalOrder () . Не са необходими аргументи и поръчката е възходяща по подразбиране:

val ascComparator = naturalOrder()

За обекти с множество свойства можем да използваме метода compareBy . Като аргументи даваме променлив брой функции (правила за сортиране), които ще върнат Сравним обект. След това тези функции ще бъдат извиквани последователно, докато полученият Сравним обект не бъде оценен като неравен или докато всички функции бъдат извикани.

В следващия пример то . първата стойност се използва за сравнения и само когато стойностите са равни, ще се извика it.second, за да се прекъсне връзката:

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

Чувствайте се свободни да разгледате kotlin.comparisons, за да откриете всички налични фабрики.

3.2. Обработка на нулеви стойности

Един прост начин за подобряване на нашия Comparator с обработка на нулева стойност е използването на методите nullsFirst или nullsLast . Тези методи ще сортират нулеви стойности съответно на първо или последно място:

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)

Резултатът от горния код ще бъде:

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

Можем да видим, че последната стойност в получената колекция е тази с нулева стойност.

3.3. Обръщане на реда

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.

Нашият списък с ученици съдържа възраст и име за всеки човек. Искаме да бъдат сортирани от най-малките до най-старите и, когато са на една и съща възраст, да се спускат въз основа на името:

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

Резултатът от горния код ще бъде:

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

4. Заключение

В този бърз урок видяхме как да използваме методите sort , sortBy и sortWith , за да сортираме колекции в Kotlin.

По-късно използвахме и пакета kotlin.comparisons, за да създадем обекти за сравнение и да ги подобрим с допълнителни правила за сортиране.

Прилагането на всички тези примери и фрагменти може да бъде намерено в GitHub.