Программирование на языке 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') | Заменяет по индексу символ на указанный |
Домашнее задание
[править]- В учебном проекте создать файл StringType.sc (Scala-Worksheet).
- Создать по два произвольного литерала каждого типа.
- Скопировать и выполнить все методы из таблицы операций. Проанализировать полученные результаты.