Руководство по сортировке в Котлине

Руководство по сортировке в Котлине

1. обзор

Kotlin строится поверх инфраструктуры Java Collection с использованиемextension methods. Это значительно улучшает удобство использования и читаемость без необходимости использования сторонних зависимостей, таких какApache Commons илиGuava.

В этом руководстве мы сосредоточимся на сортировке в Котлине. Кроме того, мы будем использовать пакетkotlin.comparisons для реализации сложных правил упорядочивания.

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

Kotlin предоставляет несколько утилит для упрощения процесса сортировки коллекций. Давайте рассмотрим несколько из этих методов.

2.1. Sortс

The simplest way to sort a collection is to call the sort method. Этот метод будет использовать естественный порядок элементов. Кроме того, по умолчанию он будет упорядочен по возрастанию, поэтому «a» стоит перед «b», а «1» - перед «2»:

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

И результат кода выше:

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

Важно отметить, что мы использовали изменяемую коллекцию. Причина в том, чтоthe sort method will sort in-place. Если мы хотим, чтобы результат возвращался в виде нового списка, тогда нам просто нужно вместо этого использовать методsorted.

Кроме того, мы можем использовать методыsortDescending илиreverse для сортировки в порядке убывания.

2.2. SortByс

Если нам нужно отсортировать по определенным свойствам данного объекта, мы можем использоватьsortBy. The sortBy method allows us to pass a selector function as an argument.. Функция селектора получит объект и должна вернуть значение, по которому мы хотим отсортировать:

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 илиreverse.

2.3. SortWithс

Для более продвинутого использования (например, для объединения нескольких правил) мы можем использовать методsortWith.

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

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.

Для порядка убывания мы можем использовать методreverse или, альтернативно, определить правыйComparator.

3. сравнение

Kotlin содержит очень полезный пакет для созданияComparator -kotlin.comparisons.  В следующих разделах мы обсудим:

  • Comparator создание

  • Обработка значенийnull

  • В обратном порядке

  • Comparator расширение правил

3.1. Comparator Создание

Чтобы упростить создание нашегоComparator, Kotlin, предлагает множество фабричных методов, чтобы сделать наш код более выразительным.

Самая простая доступная фабрикаComparator -naturalOrder().. Аргументы не требуются, и по умолчанию порядок возрастает:

val ascComparator = naturalOrder()

Для объектов с несколькими свойствами мы можем использовать методcompareBy. В качестве аргументов мы даем переменное количество функций (правил сортировки), каждая из которых будет возвращать объектComparable. Затем эти функции будут вызываться последовательно, пока результирующий объектComparable не будет оценен как не равный, или пока не будут вызваны все функции.

В следующем примере значениеit.first используется для сравнений, и только когда значения равны, будет вызыватьсяit.second, чтобы разорвать связь:

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

Не стесняйтесь исследоватьkotlin.comparisons, чтобы обнаружить все доступные фабрики.

3.2. Обработка значенийnull

Простой способ улучшить нашComparator с помощью обработки значенийnull - использовать методыnullsFirst илиnullsLast. Эти методы сортируют значенияnull на первое или последнее место соответственно:

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

Мы видим, что последнее значение в результирующей коллекции - это значение со значениемnull.

3.3. Отменить заказ

Чтобы изменить порядок, мы можем использовать методreverseOrder илиreversed метод.. Первый метод не имеет аргументов и возвращает порядок убывания. Последний метод можно применить к объектуComparator, и он вернет его перевернутый объектComparator.

Чтобы построитьComparator, используя убывающий естественный порядок, мы можем сделать:

reverseOrder()

3.4. Расширение правил компаратора

ОбъектыComparator можно комбинировать или расширять с помощью дополнительных правил сортировки с помощью методовthen, доступных в пакетеkotlin.comparable.

Только когда первый компаратор оценивается как равный, тогда второй компаратор будет использоваться.

Наш список студентов содержит возраст и имя для каждого человека. Мы хотим, чтобы они сортировались от самых младших к старшим, и, когда они достигли того же возраста, по убыванию по названию:

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 для создания объектовComparator и улучшения их с помощью дополнительных правил сортировки.

Реализацию всех этих примеров и фрагментов можно найти вover on GitHub.