0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Группировка и сортировка

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 — разбиение на группы в Map
  • groupMapReduce — группировка, преобразование и сокращение за один проход

Часто задаваемые вопросы

Урок «Группировка и сортировка» бесплатный?

Да — полный текст урока «Группировка и сортировка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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 — локальная установка не требуется.

Все уроки этого курса

  1. List, Vector, Set, Map
  2. Преобразования
  3. Свёртка и редукция
  4. Группировка и сортировка
← Назад к Scala for Backend Engineering & Functional Programming