Программирование на языке Scala/Типы Char и String

Тип Char править

Тип Char используется для представления символов. Представляет одиночный символ в кодировке Unicode-16 (от 0 до 216 – 1 включительно). Символы Unicode включают буквы, цифры, знаки препинания, специальные символы и многое другое. Каждый Char занимает 16 бит (2 байта), что позволяет представлять множество символов из различных языков и символьных наборов.

Символы могут быть вставлены в строки с помощью оператора +.

Можно сравнивать символы на равенство или порядок. При сравнении символов используются их Unicode-коды для определения их отношения. Пример:

val char1: Char = 'A'
val char2: Char = 'B'
val char3: Char = 'C'

char1 < char2 // true, так как код 'A' (65) меньше кода 'B' (66)
char2 > char3 // false, так как код 'B' (66) больше кода 'C' (67)
char1 == char3 // false, так как код 'A' (65) не равен коду 'C' (67)

Методы типа Char почти аналогичны методам типа Int. Некоторые уникальные методы для типа Char:

Метод Назначение
isControl это спец.символ?
isDigit это цифра?
isLetter это буква?
isWhitespace это пробел?

Литералы типа Char править

Символьные литералы можно задать любым Unicode­ символом, заключая его в одинарные кавычки. Пример: 'a'

Его можно указывать с помощью кода из таблицы символов Unicode. Для этого нужно записать \u, после чего указать четыре шестнадцатеричные цифры кода: '\u0041'

Спец.символы указываются с использованием символа экранировки \ Таблица часто используемых спец.символов:

Литерал Предназначение
\n Перевод строки (\u000A)
\b Возврат на одну позицию (\u0008)
\t Табуляция (\u0009)
\f Перевод страницы (\u000C)
\r Возврат каретки (\u000D)
\” Двойная кавычка (\u0022)
\’ Одинарная кавычка (\u0027)
\\ Обратный слеш (\u005C)


Тип String править

Тип String является сложным, непримитивным типом и реализован на языке Java. Тип полностью совместим с языком Scala, имеет много методов и высоковостребован. Тип представляет собой неизменяемый массив значений типа Char. Все методы типа String не изменяют существующий массив значений, а создают новый - как результат.

Строки можно сравнивать на равенство и больше или меньше. Строки сравниваются лексикографически, что означает, что сравнение происходит посимвольно, начиная с первого символа и до тех пор, пока не будет найдено отличие или одна из строк не закончится. Если есть разница в символах, то строка с символом с большим кодом будет большей. Если все символы совпадают, а одна строка длиннее другой, то более длинная строка считается большей. Пример сравнения строк:

val str1: String = "apple"
val str2: String = "banana"
val str3: String = "apple"
val str4: String = "applу"

str1 > str2 // false
str1 == str3 // true
str1 > str4 // false

Литералы типа String править

Простой строковый литерал править

Литерал состоит из произвольного количества символов, заключенных в двойные кавычки. Пример: "abc"

Можно указывать все спец.символы, также как в литералах символов, с помощью символа экранировки \. Пример: "\n"

Неформатированный литерал править

Неформатированная строка начинается и заканчивается тремя идущими подряд двойными кавычками ("""). Внутри нее могут содержаться любые символы, включая кавычки и специальные символы, за исключением, разумеется, трех кавычек подряд. Например, следующая программа выводит сообщение, используя неформатированый литерал:

println("""Welcome to Ultamix 3000.
           Type "HELP" and '\n' for help.""")

Почти все хорошо. Все спец. символы и кавычки на месте. Но есть лишние символы впереди второй строки:

Welcome to Ultamix 3000.
           Type "HELP" and '\n' for help.

Чтобы справиться с этой весьма часто возникающей ситуацией, вы можете вызывать в отношении строк метод stripMargin. Чтобы им воспользоваться, поставьте символ вертикальной черты (|) перед каждой строкой текста, а затем в отношении всей строки вызовите метод stripMargin:

println("""|Welcome to Ultamix 3000.
           |Type "HELP" for and '\n' help.""".stripMargin)

Вот теперь код ведет себя подобающим образом:

Welcome to Ultamix 3000.
Type "HELP" and '\n' for help

Литерал с интерполяцией s править

Литерал позволяет встраивать значение не строкогого типа в строку, без использования операции конкатинации строк.

val old = 25
println(s"Have you turned $old yet?")

Встраивать в строку также можно и выражения:

val old = 25
val add = 1
println(s"Have you turned ${old + add} yet?")

Литерал с интерполяцией f править

Интерполятор строк f позволяет прикреплять к встроенным выражениям инструкции форматирования значения. Инструкции ставятся после выражения и начинаются со знака процента (%), при этом используется синтаксис, заданный классом java.util.Formatter. Например, вот как можно было бы отформатировать число π:

f"${math.Pi}%.5f"

Некоторые операции типа String править

Метод Описание
"abc".apply(0) Получение символа по его индексу
"abc"(0) Получение символа по его индексу, сокращенный синтаксис apply
"abc".charAt(0) Получение символа по его индексу, аналог apply
"abc".length Получение длины строки
"abc".substring(start, end - 1) Получение подстроку, начиная с индекса start и заканчивая end - 1
"abc".concat("abc") Объединяет текущую строку с указанной строкой
"abc".toUpperCase Преобразуют строку в верхний регистр
"abc".toLowerCase Преобразуют строку в нижний регистр
"abc".trim Удаляет начальные и конечные пробелы
"abc".startsWith("a") Проверяет, начинается ли строка с указанного префикса
"abc".indexOf("b") Возвращает индекс первого вхождения подстроки
"abcabc".lastIndexOf("b") Возвращает индекс последнего вхождения подстроки
"abc".replace("a", "x") Заменяет все вхождения "a" на "x"
"abc".split("b") Разбивает строку на два массива подстрок по указанному разделителю
"abc".isEmpty Проверяют, пустая ли строка
"abc".nonEmpty Проверяют, есть ли в строке символы
"abc".contains("ab") Проверяет, содержит ли строка указанную подстроку
"abc".compareTo("abc") Сравнивает строки. Если строки равны то 0. Если первая больше, то значение больше нуля. Если первая меньше, то значение меньше нуля.
"abc".endsWith("bc") Проверяет, заканчивается ли строка на "bc"
"abc" == "abc" Проверяет, равны ли строки
"abc".getBytes() Возвращает массив байт
"abc".hashCode Возвращает хеш-код строки
"abc".indent(3) Вставляет отступ из пробелов в начале строки
"abc".isBlank Проверяет, является ли строка пустой или состоящей из пробелов
"abc".matches("[a-zA-Z]+") Проверяет, соответствует ли строка заданному регулярному выражению
"abc".r Создает регулярное выражение из строки
"abc".last Возвращает последний символ
"abc".repeat(3) Повторяет строку n раз
" abc ".strip() Удаляет начальные и конечные пробелы
"abc" != "abc" Проверяет не равны ли строки
"abc" * 2 Повторяет строку n раз
"abc + "abc" Конкатенирует (соединяет) строки
"ab" < "abc" Сравнение строки (меньше) с другой строкой посимвольно, сравнивая по номерам юникода
"abc" > "ab" Сравнение строки (больше) с другой строкой посимвольно, сравнивая по номерам юникода
"abc" <= "ab" Сравнение строки (меньше, либо равно) с другой строкой посимвольно, сравнивая по номерам юникода
"abc" >= "ab" Сравнение строки (больше, либо равно) с другой строкой посимвольно, сравнивая по номерам юникода
'd' +: "abc" Создает новую строку с доп.символом в начале
"abc" :+ 'd' Создает новую строку с доп.символом в конце
"abc".apply(1) или "abc"(1) Возвращает символ по индексу. Apply можно не писать, только указать аргумент в скобках. Apply является служебным методом во всех типах.
"abc".capitalize Возвращает строку с первой буквой верхнего регистра
"abc".drop(n) Удаляет первые n символов
"abc".dropRight(n) Удаляет последние n символов
"abc".distinct Выбирает все уникальные символы и игнорирует дубликаты
"abc".init Возвращает часть строки без последнего символа
"abc".head Возвращает первый символ из строки
"abc".indices Создает диапазон всех индексов этой строки
"abc".reverse Возвращает новую последовательность с элементами в обратном порядке
"abc".size Возвращает длину строки
"abc".tail Возвращает строку без первого символа (хвост)
"abcabc".slice(0, 4) Возвращает строку с элементами в указанном диапазоне
"abc".toCharArray Преобразует строку в новый массив символов
"true".toBoolean Преобразует строку в Boolean операцию, если не содержит Boolean операции, кидает Exception
"123".toByte Преобразует строку в байты (строка должна содержать только десятичные цифры и необязательный начальный знак - или +)
"123".toDouble Преобразует строку в Double (строка должна содержать только десятичные цифры и необязательный начальный знак - или +, окружающие пробелы удаляются с помощью обрезки)
"123".toFloat Преобразует строку в Float (строка должна содержать только десятичные цифры и необязательный начальный знак - или +, окружающие пробелы удаляются с помощью обрезки)
"123".toShort Преобразует строку в Short (строка должна содержать только десятичные цифры и необязательный начальный знак - или +)
"123".toInt Преобразует строку в Int (строка должна содержать только десятичные цифры и необязательный начальный знак - или +)
"123".toLong Преобразует строку в Long (строка должна содержать только десятичные цифры и необязательный начальный знак - или +)
"abc".mkString("<", ",", ">") Форматирует строку "abc" в строку "<a,b,c>"
"abc".diff("b") Возвращает разность между исходной строкой и строкой сравнения
"abc".padTo(4, '-') Возвращает строку с добавленным символом до указаного размера "abc-"
"abc".patch(1, "2222", 1) Заменяет указаное количество символов указаной строкой, начиная с указаного символа
"abc\n".stripLineEnd Удаляет разделитель перевода строки
"abc".take(n) Берет первые n символов
"abc".updated(0, '1') Заменяет по индексу символ на указанный

Домашнее задание править

  1. В учебном проекте создать файл StringType.sc (Scala-Worksheet).
  2. Создать по два произвольного литерала каждого типа.
  3. Скопировать и выполнить все методы из таблицы операций. Проанализировать полученные результаты.