Android kotlin list sort

Kotlin List sort, sorted, sortBy, sortedBy, sortWith, sortedWith example

In this tutorial, I will show you many ways to sort Kotlin List using sort , sorted , sortBy , sortedBy , sortWith , sortedWith methods.

Kotlin sort

You can use sort() method to sort a Mutable List in-place, and sortDescending() for descending order.

val nums = mutableListOf(3, 1, 7, 2, 8, 6) nums.sort() // nums: [1, 2, 3, 6, 7, 8] 
nums.sortDescending(); // nums: [8, 7, 6, 3, 2, 1] 

Kotlin sorted

sorted() and sortedDescending() don’t change the original List. Instead, they return another sorted List.

val nums = mutableListOf(3, 1, 7, 2, 8, 6) val sortedNums = nums.sorted() // nums: [3, 1, 7, 2, 8, 6] // sortedNums: [1, 2, 3, 6, 7, 8] 
val sortedNumsDescending = nums.sortedDescending() // nums: [3, 1, 7, 2, 8, 6] // sortedNumsDescending: [8, 7, 6, 3, 2, 1] 

Kotlin sortBy

sortBy() helps us to sort a Multable List in-place by specific field. We need to pass a selector function as an argument.

For descending order, we use sortByDescending().

val myDates = mutableListOf( MyDate(4, 3), MyDate(5, 16), MyDate(1, 29) ) myDates.sortBy < it.month >myDates.forEach < println(it) >/* MyDate(month=1, day=29) MyDate(month=4, day=3) MyDate(month=5, day=16) */ 
myDates.sortByDescending < it.month >myDates.forEach < println(it) >/* MyDate(month=5, day=16) MyDate(month=4, day=3) MyDate(month=1, day=29) */ 

Kotlin sortedBy

Instead of changing the order of original List. sortedBy() and sortedByDescending() return a sorted List, the original List isn’t affected.

val myDates = mutableListOf( MyDate(4, 3), MyDate(5, 16), MyDate(1, 29) ) val sortedDates = myDates.sortedBy < it.month >myDates.forEach < println(it) >/* MyDate(month=4, day=3) MyDate(month=5, day=16) MyDate(month=1, day=29) */ sortedDates.forEach < println(it) >/* MyDate(month=1, day=29) MyDate(month=4, day=3) MyDate(month=5, day=16) */ 
val sortedDatesDescending = myDates.sortedByDescending < it.month >myDates.forEach < println(it) >/* MyDate(month=4, day=3) MyDate(month=5, day=16) MyDate(month=1, day=29) */ sortedDatesDescending.forEach < println(it) >/* MyDate(month=5, day=16) MyDate(month=4, day=3) MyDate(month=1, day=29) */ 

Kotlin sortWith

How about continue to sort day after sorting month?
We’re gonna use sortWith() for ascending order and additional method reverse() for descending order.

val myDates = mutableListOf( MyDate(8, 19), MyDate(5, 16), MyDate(1, 29), MyDate(5, 10), MyDate(8, 3) ) myDates.sortWith(compareBy < it.month >.thenBy < it.day >) myDates.forEach < println(it) >/* MyDate(month=1, day=29) MyDate(month=5, day=10) MyDate(month=5, day=16) MyDate(month=8, day=3) MyDate(month=8, day=19) */ 
myDates.reverse() sortedDatesDescending.forEach < println(it) >/* MyDate(month=8, day=19) MyDate(month=8, day=3) MyDate(month=5, day=16) MyDate(month=5, day=10) MyDate(month=1, day=29) */ 

Kotlin sortedWith

sortedWith() and reversed() return a sorted List instead of changing original List order.

val sortedDates = myDates.sortedWith(compareBy < it.month >.thenBy < it.day >) myDates.forEach < println(it) >/* MyDate(month=8, day=19) MyDate(month=5, day=16) MyDate(month=1, day=29) MyDate(month=5, day=10) MyDate(month=8, day=3) */ sortedDates.forEach < println(it) >/* MyDate(month=1, day=29) MyDate(month=5, day=10) MyDate(month=5, day=16) MyDate(month=8, day=3) MyDate(month=8, day=19) */ 
val sortedDatesDescending = myDates.sortedWith(compareBy < it.month >.thenBy < it.day >).reversed() myDates.forEach < println(it) >/* MyDate(month=8, day=19) MyDate(month=5, day=16) MyDate(month=1, day=29) MyDate(month=5, day=10) MyDate(month=8, day=3) */ sortedDatesDescending.forEach < println(it) >/* MyDate(month=8, day=19) MyDate(month=8, day=3) MyDate(month=5, day=16) MyDate(month=5, day=10) MyDate(month=1, day=29) */ 

Sort List of Objects

It’s more complicated, so I write in a separated Tutorial. You can find at:
Kotlin – Sort List of custom Objects

Further Reading

Источник

Сортировка коллекций

Для некоторых типов коллекций является важным аспектом то, как упорядочены их элементы. Например, два списка с одинаковыми элементами не равны, если их элементы упорядочены по-разному.

В Kotlin порядок объектов можно задать несколькими способами.

Во-первых, существует естественный порядок (ориг. natural order). Он характерен для наследников интерфейса Comparable . Если не был указан другой порядок сортировки, то они будут отсортированы в естественном порядке.

Большинство встроенных типов являются Comparable :

  • Числовые типы используют традиционный числовой порядок: 1 больше, чем 0 ; -3.4f больше, чем -5f и т.д.
  • Char и String используют лексикографический порядок: b больше, чем a ; world больше, чем hello .

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

  • Положительное значение показывает, что объект-приёмник больше аргумента.
  • Отрицательное значение показывает, что объект-приёмник меньше аргумента.
  • Ноль показывает, что объекты равны.

В примере ниже показан класс для сортировки версий, состоящий из переменных major и minor .

class Version(val major: Int, val minor: Int): Comparable  < override fun compareTo(other: Version): Int < if (this.major != other.major) < return this.major - other.major >else if (this.minor != other.minor) < return this.minor - other.minor >else return 0 > > fun main() < println(Version(1, 2) >Version(1, 3)) // false println(Version(2, 0) > Version(1, 5)) // true > 

Пользовательский порядок (ориг. custom order) позволяет вам сортировать экземпляры любого типа так, как вам нравится. В частности, вы можете определить порядок для сортировки объектов, не являющихся наследниками Comparable , а также задать Comparable типам порядок, отличный от естественного. Осуществляется это при помощи Comparator . У Comparator есть функция compare() , которая принимает два объекта, а в качестве результата сравнения возвращает целое число. Результат интерпретируется так же, как описано выше для функции compareTo() .

fun main() < val lengthComparator = Comparator < str1: String, str2: String ->str1.length - str2.length > println(listOf("aaa", "bb", "c").sortedWith(lengthComparator)) // [c, bb, aaa] > 

С помощью lengthComparator вы можете изменить порядок сортировки строк: вместо сортировки в лексикографическом порядке они будут отсортированы по длине.

Существует более упрощённый вариант использования Comparator — функция compareBy() из стандартной библиотеки. Она принимает лямбда-функцию, которая из объекта создаёт Comparable значение и задаёт пользовательский порядок, который по факту представляет собой естественный порядок созданных Comparable значений.

Используя compareBy() можно модифицировать lengthComparator из примера выше следующим образом:

Kotlin предоставляет функции, которые позволяют сортировать коллекции в естественном, пользовательском и даже в случайном порядке. В текущем разделе рассмотрены функции сортировки, которые работают только с неизменяемыми коллекциями. Такие функции возвращают результат сортировки в виде новой коллекции, содержащей элементы исходной коллекции, но упорядоченные в соответствии с заданным условием. Информация о функциях для сортировки изменяемых коллекций находится в разделе List: специфичные операции.

Естественный порядок

Основные функции sorted() и sortedDescending() возвращают элементы коллекции, отсортированные по возрастанию или убыванию в соответствии с их естественным порядком. Эти функции могут быть применены к коллекциям, содержащим элементы Comparable типа.

fun main() < val numbers = listOf("one", "two", "three", "four") println("Sorted ascending: $") // Sorted ascending: [four, one, three, two] println("Sorted descending: $") // Sorted descending: [two, three, one, four] > 

Пользовательский порядок

Для сортировки объектов в пользовательском порядке или для сортировки объектов, не являющихся наследниками Comparable , существуют функции sortedBy() и sortedByDescending() . Они используют функцию-селектор для преобразования элементов коллекции в Comparable значения и сортируют коллекцию в естественном порядке этих значений.

fun main() < val numbers = listOf("one", "two", "three", "four") val sortedNumbers = numbers.sortedBy < it.length >println("Sorted by length ascending: $sortedNumbers") // Sorted by length ascending: [one, two, four, three] val sortedByLast = numbers.sortedByDescending < it.last() >println("Sorted by the last letter descending: $sortedByLast") // Sorted by the last letter descending: [four, two, one, three] > 

Чтобы задать пользовательский порядок для сортировки коллекции, вы можете предоставить свой собственный Comparator . Для этого вызовите функцию sortedWith() и передайте ей свой Comparator . С помощью этой функции сортировка строк по их длине будет выглядеть следующим образом:

fun main() < val numbers = listOf("one", "two", "three", "four") println("Sorted by length ascending: $)>") // Sorted by length ascending: [one, two, four, three] > 

Обратный порядок

С помощью функции reversed() вы можете получить коллекцию, отсортированную в обратном порядке.

reversed() возвращает новую коллекцию с копиями элементов из исходной коллекции. Поэтому, если вы измените исходную коллекцию, это не повлияет на ранее полученный от reversed() результат.

Другая функция — asReversed() — возвращает перевёрнутое представление исходной коллекции. Эта функция может быть более легковесной и предпочтительной, чем reversed() , при условии, что исходная коллекция не будет изменяться.

Если же в исходную коллекцию будут внесены изменения, все эти изменения отразятся в её перевёрнутых представлениях и наоборот.

Однако, если источник не является списком, либо неизвестно является ли список изменяемым, тогда функция reversed() более предпочтительна для использования, поскольку она возвращает копию, которая в будущем не изменится.

Случайный порядок

Наконец, существует функция shuffled() , которая возвращает новый List , содержащий элементы исходной коллекции в случайном порядке. Её можно вызывать либо без аргументов, либо с объектом Random .

Источник

Читайте также:  Циклы в python сообщение
Оцените статью