Группировка и сортировка
groupBy и sortBy
«Группировка и сортировка» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Организация данных
Данные из реального мира часто требуется сгруппировать по свойству или отсортировать по ключу. В коллекциях Scala есть groupBy, sortBy, sortWith и другие средства для декларативного решения этой задачи.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(5, 3, 8, 1, 9, 2)
println(nums.sorted)
}
}sorted: естественный порядок
sorted сортирует элементы в их естественном порядке (числа — по возрастанию, строки — в алфавитном порядке). Для этого требуется правило упорядочивания, существующее для распространённых типов.
object Main {
def main(args: Array[String]): Unit = {
println(List(3, 1, 2).sorted)
println(List("pear", "apple", "fig").sorted)
}
}sortBy: сортировка по ключу
sortBy сортирует элементы по значению, полученному из каждого элемента. Укажите функцию, извлекающую ключ сортировки.
object Main {
def main(args: Array[String]): Unit = {
val words = List("banana", "fig", "apple")
val byLength = words.sortBy(_.length)
println(byLength)
}
}Сортировка по убыванию
Чтобы отсортировать элементы по убыванию, инвертируйте числовой ключ или используйте sorted(Ordering.Int.reverse). Для производных ключей кратко записать sortBy с минусом.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(5, 3, 8, 1)
println(nums.sortBy(-_))
println(nums.sorted(Ordering.Int.reverse))
}
}sortWith: собственный компаратор
sortWith принимает функцию, возвращающую true, если первый аргумент должен стоять перед вторым, и тем самым предоставляет полный контроль над порядком.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(5, 3, 8, 1)
val descending = nums.sortWith((a, b) => a > b)
println(descending)
}
}Сортировка по нескольким ключам
sortBy может возвращать кортеж для одновременной сортировки по нескольким ключам: сначала сравнивается первый элемент, затем второй, чтобы разрешить равенство.
object Main {
def main(args: Array[String]): Unit = {
val people = List(("Ann", 30), ("Bob", 25), ("Ann", 22))
val sorted = people.sortBy { case (name, age) => (name, age) }
println(sorted)
}
}groupBy: разбиение в Map
groupBy возвращает Map, где каждый ключ — это результат вашей функции, а каждое значение — список элементов с этим ключом.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3, 4, 5, 6)
val byParity = nums.groupBy(_ % 2 == 0)
println(byParity)
}
}Группировка по вычисляемому ключу
Ключом группировки может быть что угодно: первая буква, длина или категория. Каждый отдельный ключ становится отдельной группой.
object Main {
def main(args: Array[String]): Unit = {
val words = List("apple", "avocado", "banana", "cherry", "cranberry")
val byFirstLetter = words.groupBy(_.head)
byFirstLetter.foreach { case (letter, ws) => println(s"$letter -> $ws") }
}
}Преобразование групп
После группировки часто требуется обобщить данные каждой группы. Используйте view.mapValues (или map), чтобы преобразовать значения, например подсчитать элементы в каждой группе.
object Main {
def main(args: Array[String]): Unit = {
val words = List("cat", "car", "dog", "deer", "cow")
val counts = words.groupBy(_.head).view.mapValues(_.size).toMap
println(counts)
}
}groupMapReduce за один шаг
groupMapReduce группирует элементы, преобразует каждый из них и сокращает значения каждой группы — всё за один проход. Это краткий способ строить сводные данные, например суммы по категориям.
object Main {
def main(args: Array[String]): Unit = {
val sales = List(("books", 10), ("toys", 5), ("books", 7), ("toys", 3))
val totals = sales.groupMapReduce(_._1)(_._2)(_ + _)
println(totals)
}
}Объединение группировки и сортировки
Распространённый шаблон: сгруппировать данные, обобщить каждую группу, а затем отсортировать сводные данные. Здесь мы подсчитываем слова по первой букве и сортируем по количеству.
object Main {
def main(args: Array[String]): Unit = {
val words = List("apple", "avocado", "banana", "cherry", "cranberry", "apricot")
val ranked = words
.groupBy(_.head)
.view.mapValues(_.size).toList
.sortBy(-_._2)
println(ranked)
}
}Быстрая проверка
Что возвращает List(1,2,3,4).groupBy(_ % 2 == 0)?
Повторение
Вы изучили группировку и сортировку:
sorted— естественный порядокsortBy— сортировка по производному ключу (кортеж для нескольких ключей)sortWith— собственный компараторgroupBy— разбиение на группы вMapgroupMapReduce— группировка, преобразование и сокращение за один проход
Часто задаваемые вопросы
Урок «Группировка и сортировка» бесплатный?
Да — полный текст урока «Группировка и сортировка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «Группировка и сортировка»?
groupBy и sortBy Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Группировка и сортировка»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- List, Vector, Set, Map
- Преобразования
- Свёртка и редукция
- Группировка и сортировка