Kotlin Academy · Урок

Диапазоны Char и пользовательские диапазоны

Выходите за пределы целых чисел

Урок 4 из 413 шагов

«Диапазоны Char и пользовательские диапазоны» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Не только целые числа

Диапазоны предназначены не только для Int. Kotlin поддерживает диапазоны символов и других сравнимых типов.

В этом уроке рассматриваются диапазоны символов и то, как пользовательские типы могут работать с rangeTo.

Итоги по диапазонам символов

У символов есть определённый порядок, поэтому 'a'..'z' является допустимым диапазоном.

Можно выполнять перебор, проверять принадлежность и делать многое другое.

fun main() {
    for (c in 'a'..'f') print(c)
    println()
    println('q' in 'a'..'z')
}

Проверка символов

Диапазоны символов делают проверку ввода понятной, например при проверке цифр или букв.

fun isDigit(c: Char): Boolean = c in '0'..'9'

fun main() {
    println(isDigit('7'))
    println(isDigit('x'))
}

Подсчёт букв

Можно быстро создать алфавит, перебрав диапазон символов и собрав его значения.

fun main() {
    val alphabet = ('a'..'z').toList()
    println(alphabet.size)
    println(alphabet.first())
    println(alphabet.last())
}

Диапазоны Long

Диапазоны работают и с типом Long, что удобно для больших числовых интервалов.

Используются те же операторы.

fun main() {
    val big = 1L..5L
    println(big.sum())
}

Диапазоны сравнимых типов

Любой тип Comparable может образовать диапазон с помощью .., хотя такие диапазоны поддерживают только проверку принадлежности, но не перебор.

Например, диапазоны String проверяют лексикографический порядок.

fun main() {
    val range = "apple".."mango"
    println("cherry" in range)
    println("zebra" in range)
}

Почему некоторые диапазоны нельзя перебирать

Для перебора нужен определённый шаг. У целых чисел и символов он есть — прибавление 1, — а у строк и чисел с плавающей точкой нет очевидного следующего значения.

Поэтому такие диапазоны поддерживают in, но не циклы for.

fun main() {
    val r = 1.0..5.0
    println(2.5 in r)
    // for (x in r) // not allowed for Double
}

Пользовательские типы с rangeTo

Оператор .. вызывает функцию rangeTo. Если Ваш класс реализует Comparable, принадлежность диапазону становится доступной автоматически.

Здесь простая версия класса сравнивается численно.

data class Ver(val n: Int) : Comparable<Ver> {
    override fun compareTo(other: Ver) = n - other.n
}

fun main() {
    val range = Ver(1)..Ver(5)
    println(Ver(3) in range)
    println(Ver(9) in range)
}

Оператор за кулисами

Запись a..b эквивалентна вызову a.rangeTo(b).

Форма с оператором просто является более удобным синтаксисом той же функции.

fun main() {
    val r1 = 1..5
    val r2 = 1.rangeTo(5)
    println(r1.toList() == r2.toList())
}

Выбор подходящего диапазона

Краткие рекомендации:

  • Числа и символы → перебор и проверка
  • Числа с плавающей точкой и пользовательские сравнимые типы → только проверка принадлежности
  • Нужен шаг? Используйте прогрессии целых чисел или символов
fun main() {
    println('m' in 'a'..'z')
    println(3.5 in 1.0..4.0)
    println(50 in 1..100)
}

Объединяем всё вместе

Диапазоны обобщаются на множество типов:

  • Диапазоны символов позволяют выполнять перебор и проверку
  • Диапазоны Long работают с большими интервалами
  • Сравнимые и пользовательские типы поддерживают проверку принадлежности
  • .. — это сокращённая запись для rangeTo
fun main() {
    val vowels = "aeiou"
    for (c in 'a'..'z') {
        if (c in vowels) print(c)
    }
    println()
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли диапазоны символов и пользовательские диапазоны.

Итоги

Вы изучили диапазоны символов и пользовательские диапазоны:

  • Диапазоны символов и Long перебираются так же, как диапазоны Int
  • Сравнимые типы поддерживают проверку принадлежности через ..
  • Недискретные типы поддерживают проверку in, но не могут использоваться в цикле
  • .. — это сокращённая запись для rangeTo

На этом завершается курс «Диапазоны и прогрессии».

Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

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

Урок «Диапазоны Char и пользовательские диапазоны» бесплатный?

Да — полный текст урока «Диапазоны Char и пользовательские диапазоны» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Диапазоны Char и пользовательские диапазоны»?

Выходите за пределы целых чисел Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Диапазоны Char и пользовательские диапазоны»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Операторы диапазонов
  2. step и downTo
  3. Диапазоны в циклах
  4. Диапазоны Char и пользовательские диапазоны
← Назад к Kotlin Academy