Разделить сообщение пополам в kotlin

Обновлено: 02.07.2024

Kotlin-Elementary (8): Обзор общих операций со строкой

Объясните перед Kotlin Когда дело доходит до типов данных, упоминается строковый тип, определение которого, конечно, было объяснено в предыдущей главе. Верный Kotlin Студенты, чьи типы данных не ясны. Пожалуйста, обратитесь кKotlin-Elementary (3): подробные типы данныхЭта статья.
В этой статье строка ( String ) Чтобы объяснить общие операции. Например, перехват строки, поиск, получение длины, замена и т. Д.

оглавление

Один, строковый поиск

При фактической разработке функции поиска по строке используется только несколько простых функций, здесь я объясню только несколько часто используемых функций.

1.1, получите первый элемент

Также реализован поиск первого элемента, равного определенному символу, а именно first<> Функция высшего порядка

остался один firstOrNull() Функция, это и first() Разница между функциями в том, что если строка пуста, first() Функция выдает исключение и firstOrNull() Функция вернет null . Конечно, есть firstOrNull<> Функция, это и first<> Разница между функциями в том, что если строка пуста, first<> Функция выдает исключение и firstOrNull<> Функция вернет null

1.2, получить последний элемент

При этом также реализовано нахождение последнего элемента, равного определенному символу, а именно last<> Функция высшего порядка

lastOrNull() с участием firstOrNUll() тем же. lastOrNull<> с участием firstOrNUll<> тем же.

1.3, найти элементы

Фактически, элемент поиска предоставляет две функции высшего порядка. find<> 、 findLast<> . Но с ними все в порядке firstOrNull() или lastOrNull() Функция для обработки. Я не буду здесь вдаваться в подробности.

1.3 найти индекс соответствующего элемента

Вот несколько функций для поиска индекса соответствующего элемента:

  • indexOf() : Найти индекс первого вхождения определенного элемента или строки в исходной строке.
  • indexLastOf() : Найти индекс последнего вхождения определенного элемента или строки в исходной строке.
  • indexOfFirst<> : Тем же indexOf()
  • indexOfLast<> : Тем же indexLastOf()

Во-вторых, перехват строки

если у вас есть Java Или основы программирования на других языках. Я считаю, что вы должны быть знакомы с перехватом строк. Вы можете продолжать смотреть вниз, так как это всего лишь консолидация перехвата строки. Конечно, вы также можете пропустить этот раздел напрямую, потому что в Kotlin В, функция перехвата строк subString() Называется Java средний subString() функция.

в Kotlin Помимо звонков subString() В дополнение к функции вы также можете вызвать subSequence() Функция, друзья, кому интересно, могут проверить исходный код.

2.1, используйте subString() Перехват функции

Давайте взглянем subString() Исходный код функции

Как видно из исходного кода выше, Kotlin Используется Java средний subString() функция

  • startIndex Параметры: начальный индекс перехваченной строки
  • endIndex Параметры: конечный индекс перехваченной строки
  • rang Параметр относится к IntRang Виды
  • использовать subString(startIndex,endIndex) с участием subString(rang) Разница во времени. Это видно из приведенных выше результатов в сочетании с исходным кодом.
  • Помните, что нижний индекс находится за пределами поля. который StringIndexOutOfBoundsException аномальный

2.2, используйте subSequence() Перехват функции

в Kotlin В дополнение к использованию, описанному выше subString() В дополнение к перехвату строк вы также можете использовать subSequence() Функция перехвата.

Давайте посмотрим на его реализацию в исходном коде:

Из исходного кода мы видим, что он примерно такой же, как subString() Функция та же, но не только пропуск startIndex случай

Три, замена струн

То же, что и вышеупомянутый перехват строки, если у вас есть опыт программирования, вы можете пропустить этот раздел. Но для функции замены строки Kotlin Помимо достижения Java средний replace() Помимо функции ha, еще одна replaceFirst() 、 replaceAfter() 、 replaceBefore() 、 replaceIndent() , И другие функции. Значение этих функций будет объяснено на примерах ниже.

3.1, функция replace ()

replace() Функция предоставляет 4 перегруженных функции. Они могут выполнять разные функции

3.1.1、 replace(oldChar,newChar,ignoreCase = false)

  • Функция: заменить все символы в исходной строке новыми символами. Затем верните новую строку
  • Описание параметра:
  1. oldChar : Символ, который нужно заменить
  2. newChar : Новые персонажи
  3. ignoreCase : Цитировать Java средний replace() функция. Значение по умолчанию - false , Готов к использованию Java из replace() функция

3.1.2、 replace(oldValue,newValue,ignoreCase = false)

  • Функция: заменить все символы в исходной строке новыми символами. Затем верните новую строку
  • Описание параметра:
  1. oldValue : Строка, которую нужно заменить
  2. newValue : Новая строка
  3. ignoreCase : Цитировать Java средний replace() функция. Значение по умолчанию - false , Готов к использованию Java из replace() функция

3.1.3、 replace(regex,replacement)

  • Функция: сопоставление исходной строки в соответствии с определенными обычными правилами и замена строки, соответствующей правилу, новой строкой.
  • Описание параметра:
  1. regex : Регулярное выражение
  2. replacement : Новая строка

3.1.4、 replace(regex: Regex, noinline transform: (MatchResult) -> CharSequence)

  • Функция: сопоставить исходную строку в соответствии с определенными обычными правилами и передать строку, которая соответствует правилам transform<> Новая замена строки для отображения функций высшего порядка.
  • Описание параметра:
  1. regex : Регулярное выражение
  2. transform : Функции высшего порядка

Вы можете видеть разницу между двумя функциями из двух вышеупомянутых функций. на Функция высшего порядка 、 Регулярное выражение Точки знаний можно понять, взглянув на информацию. Xiaosheng добавит соответствующий контент в следующих главах .

После вышеуказанного replace() Объяснение функции. И проанализировал несколько перегруженных функций. Я считаю, что все правы replace() Параметры в функции имеют общее понимание. И следующие функции - это примерно одна и та же операция. Поэтому для следующих операций с функциями я только проиллюстрирую их эффекты. Введение параметров не будет подробно

3.2, функция replaceFirst ()

Функция: заменить первый символ или строку, удовлетворяющую условию, новым символом или строкой.

3.3, функция replaceBefore ()

Функция: перехватить первый символ, который соответствует условию, или символьную строку после символьной строки, включая символ, который соответствует условию, или саму символьную строку, и добавить новую символьную строку перед ним.

3.4, функция replaceBeforeLast ()

Функция: перехватить последний символ, который соответствует условию, или строку символов после строки символов, включая символ, который соответствует условию, или саму строку символов, и добавить новую строку символов перед ним.

3.5, функция replaceAfter ()

Функция: перехватить первый символ, который соответствует условию, или символьную строку перед символьной строкой, включая символ, который соответствует условию, или саму символьную строку, и добавить после него новую символьную строку.

3.6, функция replaceAfterLast ()

Функция: перехватить последний символ, который соответствует условию, или строку символов перед строкой символов, включая символ, который соответствует условию, или саму строку символов, и добавить новую строку символов после него.

В-четвертых, сегментация строк

То же, что и в предыдущем разделе, Kotlin Помимо достижения Java средний split() Помимо функций, он также предоставляет splitToSequence() Функция для разделения строки. После успешного разделения будет возвращена коллекция строк для наших последующих операций.

4.1, функция split ()

split() Функция также предоставляет 4 Перегруженная функция. Среди них использование регулярных выражений для условного деления занимает два места. Используйте разделение символов, чтобы занять одно место. Используйте разделение строк, чтобы занять одну.

4.1.2, используйте сегментацию регулярных выражений

в Kotlin Используйте регулярные выражения в Regex Класс пока Java Используется в регулярных выражениях Pattern класс. Вот примеры

4.1.2, используйте сегментацию символов или строк

В реальной разработке проекта этот метод все еще используется все чаще. Однако здесь стоит отметить, что независимо от того, разделен ли он по символу или строке, это переменный параметр. То есть количество его параметров не определено.

Вот пример случая с переменным параметром:

4.2, функция splitToSequence ()

Эта функция также может быть разделена строками или символами, и ее использование такое же, как указано выше. split() Функция такая же. Здесь особо не о чем говорить .

Пять, другие

В дополнение к пунктам, описанным выше, существует множество часто используемых процессов, таких как проверка, пуста ли строка или нет. null , Получить длину строки, перевернуть строку, статистику, преобразовать массив символов, получить символ указанного нижнего индекса и т. Д.

5.1. Получите длину строки

  1. Прямое использование length Срок приобретения недвижимости
  2. использовать count() Функция get, по сути count() Метод функции также возвращает length длина.

Вот посмотрим count() Исходный код функции

5.2, подсчитать повторяющиеся символы

Упомянутое выше count() Функция, она возвращает length Свойство получает длину строки. Фактически, исходный код также предоставляет count<> Функция высшего порядка используется для подсчета количества повторяющихся символов в строке.

Взгляните на его исходный код

Объяснение исходного кода: эта функция принимает один Boolean Тип Lambda выражение. Затем зациклите эту строку, если мое условие истинно, переменная count Самовозрастающий. Возвращает количество повторов после завершения цикла count

5.3, строка проверки

В реальном развитии, особенно Android Во время разработки мы часто сталкиваемся с проверкой того, является ли содержимое поля ввода пустой строкой. в Kotlin нейтрализовать Java Также предусмотрено несколько функций для обработки этой ситуации.

Следующие функции работают с пустыми строками или пустыми строками:

  • isEmpty() : Исходный код должен судить о его length Равно 0 , Если равно 0 Тогда вернись true , В противном случае вернуть false . Не может использоваться напрямую для строк, допускающих значение NULL
  • isNotEmpty() : Исходный код должен судить о его length Больше, чем 0 , Если больше 0 Тогда вернись true , В противном случае вернуть false . Не может использоваться напрямую для строк, допускающих значение NULL
  • isNullOrEmpty() : Исходный код должен определить, является ли строка null Или его length Это равно 0 。
  • isBlank() : Исходный код должен судить о его length Это равно 0 , Или определить, равно ли количество пробелов текущему length . Не может использоваться напрямую для строк, допускающих значение NULL
  • isNotBlank() : Исходный код правильный isBlank() Функция инвертирована. Не может использоваться напрямую для строк, допускающих значение NULL
  • isNotOrBlank() : Исходный код определяет, является ли строка null . Или позвоните по телефону isBlank() функция

5.4, ​​струнное соединение

Строковая ссылка в Java Может использоваться только в + Для ссылки, кроме конечно StringBuilder、StringBuffer Кроме. Пока в Kotlin Помимо использования + Кроме того, вы также можете использовать plus() функция. Принимает любой тип. plus() Функция - это функция, перегруженная оператором. Объяснено в предыдущей главе. Если ты прав Kotlin Я не знаю о перегрузке Юнь Суфу, вы можете проверить другую мою статью:Kotlin-Elementary (5): оператор перегружает одного

5.5, реверс струны

Как и массивы, строки также могут переворачивать элементы. Используйте напрямую reversed() Функция.

У меня есть одна строка, которая, если есть более 35 символов, должна быть разделена на другую строку. Примерно так: var string1 = "1. 38" в var result1 и var result2 = "36. 38" . Я думаю, используя сплит, но я не знаю, является ли это лучшим вариантом.

chunked(size: Int) вернет вам строку, разбитую на список:

["Привет, Тэр!", "Это!", "На самом деле", "Длинный Стрин", "Г, что я w", "Муравей сплит"]

Это расширение даст вам пару ограниченных строк, связанных с остальными:

Вы должны скорее использовать

drop and droplast (возвращает строку)

или chunked (возвращает список строк)

это зависит от вашего контекста

chunked - это определенно хорошо, если разделение на части более чем на 2 части тоже подходит для вас. Но если вы предпочитаете разбивать его не более чем на 2 части, причем первая часть имеет определенную длину, а вторая часть содержит только остаток, вы можете вместо этого использовать что-то вроде следующего (аналогично ответу s1m0nw1s, но), используя take и substring :

Или, если вы хотите избежать опасности, вы также можете добавить некоторые удобные проверки:

или если вам больше нравятся исключения:

Все эти функции возвращают вам Pair , с которой вы можете обращаться следующим образом:

Когда вы писали, что подумали об использовании split и если у вас есть соответствующий разделитель, вы можете использовать следующее:

Это разделит yourInputString на две части, где первая часть - это вся строка до первого вхождения yourDelimiter . Пример:

Допустим, у нас есть массив типа [a, b, c, d, e, f], и мы хотим разбить элементы на отдельные группы, например [[a, b], [c, d], [e, f] ]] или [[a, b, c], [d], [e, f]] .

В этом уроке мы добьемся этого, исследуя некоторые различия между Kotlin groupBy, chunked и windowed .

2. Разделение списка на список пар

В наших примерах мы будем использовать два списка - один с четным числом элементов и один с нечетным числом элементов:

Очевидно, что мы можем разделить наш evenList ровно на три пары. Однако у нашего unevenList будет один дополнительный элемент.

В оставшейся части этого раздела мы увидим различные реализации разделения наших двух списков, включая то, как они работают с дополнительным элементом в unevenList .

2.1. Использование groupBy

Во-первых, давайте реализуем решение с помощью g roupBy . Мы создадим список с возрастающими числами и будем использовать groupBy для их разделения:

Это дает желаемый результат:

Как это работает? Ну, groupBy выполняет предоставленную функцию (it + 1) / 2 для каждого элемента:

  • (1 + 1) / 2 = 1
  • (2 + 1) / 2 = 1,5, что округляется до 1
  • (3 + 1) / 2 = 2
  • (4 + 1) / 2 = 2,5, что округляется до 2
  • (5 + 1) / 2 = 3
  • (6 + 1) / 2 = 3,5, которое округляется до 3

Затем groupBy группирует элементы в списке, которые дали тот же результат.

Теперь, когда мы делаем то же самое с неравномерным списком:

Получаем все пары и один лишний элемент:

Но если мы пойдем немного дальше с некоторыми случайными числами:

Получим что-то совершенно нежелательное:

Причина проста; применение функции (it + 1) / 2 к каждому элементу дает: 1, 2, 4, 10, 12, 15 . Все результаты различаются, поэтому никакие элементы не сгруппированы.

Когда мы используем evenList или unevenList , это еще хуже - код не компилируется , так как функция не может быть применена к строкам .

2.2. Использование groupBy и withIndex

На самом деле, если мы хотим сгруппировать произвольный список в пары, мы хотим изменять не значение нашей функцией, а индекс :

Это возвращает список пар, которые мы хотим:

Более того, если мы используем unevenList , мы даже получим наш отдельный элемент:

2.3. Использование groupBy с foldIndexed

Мы можем пойти дальше простого использования индекса и немного запрограммировать с помощью foldIndexed, чтобы сэкономить некоторые выделения:

В то время как немного более многословным, foldIndexed раствор просто выполняет операцию для каждого элемента , в то время как withIndex функция сначала создает итератор и оборачивает каждый элемент.

2.4. Использование фрагментов

Но мы можем сделать это более элегантно с помощью chunked . Итак, применим метод к нашему evenList :

EvenList дает нам с парами мы хотим:

В то время как unevenList дает нам пары и дополнительный элемент:

2.5. Использование оконного

И chunked работает очень хорошо, но иногда нам нужно немного больше контроля.

Например, нам может потребоваться указать, хотим ли мы только пары или хотим ли мы включить дополнительный элемент. Оконном метод дает нам partialWindows Boolean , которое указывает , если мы хотим , частичный результат или нет.

По умолчанию partialWindows имеет значение false . Итак, следующие утверждения дают тот же результат:

Оба возвращают список без отдельного элемента:

Наконец, когда мы устанавливаем для partialWindows значение true, чтобы включить частичный результат:

Получим список пар плюс отдельный элемент:

3. Заключение

Использование groupBy - хорошее упражнение по программированию, но оно может быть весьма подвержено ошибкам. Некоторые ошибки можно устранить просто с помощью индекса .

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

Числа лежат в основе программирования, но вы будете работать не только с ними. Текстовые данные также является очень распространенным типом. Это могут быть имена людей, адреса или даже книги. Все это примеры текста, который может потребоваться обработать приложению.

Содержание статьи

Большинство языков программирования хранит текст в виде типа данных, который называется строкой, или string . Данный урок познакомит вас со строками, сначала давая базовую информацию о концепции строк, а затем показывая, как их использовать в Kotlin.

Как компьютер воспринимает строки

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

Это может показаться очень странным. Как символы могут быть числами? Компьютер умеет переводить символ на собственный язык. Он это делает, присваивая каждому символу другой номер. Это формирует двустороннее отображение символа в число, которое называется набором символов.

При нажатии клавиши символа на клавиатуре вы передаете компьютеру номер символа. Текстовый редактор преобразует число в изображение символа и показывает вам это изображение.

Unicode

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

На протяжении многих лет существовало несколько стандартов, но самым современным стандартом является Unicode. Он определяет отображение набора символов, которое сегодня используют почти все компьютеры.

На заметку: Подробнее об Unicode можете прочитать на официальном сайте.

В качестве примера рассмотрим слово cafe. Стандарт Unicode указывает, что буквы данного слова нужно представить следующим образом:

unicode

Число, связанное с каждым символом, называется кодовой точкой. В приведенном выше примере c использует кодовую точку 99, a использует кодовую точку 97 и так далее.

Конечно, Unicode предназначен не только для простых латинских символов, используемых в английском языке вроде c, a, f и e. Он также позволяет отображать символы других языков. Слово cafe происходит от французского, в котором оно пишется как café. Unicode отображает эти символы следующим образом:

unicode

Далее дан пример с использование китайских символов (Переводчик Google перевел символы как “Computer Programming”):

unicode

Вы наверняка не раз использовали смайлики, или эмодзи. По сути они являются символами, преобразованными с помощью Unicode. К примеру:

смайлики в unicode

Это только два символа. Кодовыми точками данных символов являются довольно крупные числа, но каждое из них представляет собой только одну кодовую точку. Компьютер воспринимает такие смайлики точно так же, как и любые другие символы.

Char и String — Символы и строки в Kotlin

Kotlin, как и любой хороший язык программирования, может работать напрямую с символами и строками. Для этого используются типы Char и String . Далее мы подробно рассмотрим данные типы данных и то, как с ними работать.

Тип данных Char может хранить один символ, который должен быть обрамлен в одинарные кавычки . К примеру:

Обратите внимание, что мы добавили знак доллара к имени переменной и используем её прямо в строке. В Java нам пришлось бы разбивать строку и соединять её с помощью конкатенации.

Кстати, такой код тоже будет работать, но первый способ гораздо удобнее.

Мы понимаем, что речь идёт о строке, поэтому можно было написать код без указания типа.

Если вам вдруг захочется вывести символ доллара, то используйте экранирование.

Мы использовали так называемый "строковый шаблон". За кулисами происходит соединение при помощи StringBuilder, но более удобным и быстрым способом.

Длину строки можно вычислить через функцию count().

Функции-расширения

Разработчики JetBrains добавили множество готовых функций-расширений для многих классов, в том числе и для строк. Найти их можно в файле String.kt (в студии дважды нажмите клавишу Shift и в поисковой строке наберите имя данного файла для просмотра исходника).

Некоторые примеры функций-расширений представлены ниже. На самом деле их больше, изучайте самостоятельно.

Пробежаться по строке

Строку можно рассматривать как массив символов.

Пробежаться по всей строке без использования индекса.

Пробежаться по всей строки с использованием индекса.

Саму строку можно предварительно явно перевести в массив символов.

Можно вызывать forEach.

Если вам нужен не только символ строки, но и его индекс, то вызываем forEachIndexed.

Если нужно получить отдельный символ строки по индексу без перебора всей строки, то просто указываем нужный индекс.

Если вы укажете несуществующий индекс, то получите исключение StringIndexOutOfBoundsException, поэтому делайте проверку.

Рассмотрим пример с числами. Допустим нужно произвести арифметические действия с целыми числами и вывести результат в строке.

Снова используем знак доллара, а действия с числами поместили в фигурные скобки. Kotlin сама разберётся с типами данных и сделает всю работу.

Выведем второй элемент массива.

Опять используем знак доллара и фигурные скобки.

Можно даже использовать условие.

Многострочный текст можно создать, используя тройные кавычки. Больше нам не нужны символы перевода строки \n, а также символы типа \t, \b, \r и т.д.

Метод trimMargin() позволяет убрать "пустые" символы из текста по разделителю | (по умолчанию):

На выходе получим.

Можно задать свой собственный разделитель и указать его в методе.

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

Можем делать со строкой знакомые операции в удобной обёртке.

Конвертируем строку в число

Сконвертировать строку в число можно через соответствующие методы.

Если нужно обработать ситуацию с null, то используйте другой метод.

По умолчанию мы подразумеваем десятичное счисление. Но возможна конвертация в другой системе счисления - двоичной, восьмеричной и т.д.

Также есть схожие методы toShort(), toShortOrNull(), toInt(), toIntOrNull(), toFloat(), toDouble() и т.д. Часть из них поддерживает перегруженные версии с другой системой счисления, но проверяйте поддерживаемые системы.

Не совсем про числа, но можно сконвертировать в булево значение.

Дополняем строку символами

Можно дополнить строку символами с самого начала или в конце.

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

Подстроки

Встроенные функции

Kotlin содержит множество встроенных удобных функций для работы со строками. Часть из них уже использовалась в примерах выше. Упомянем ещё несколько полезных функций.

Можно фильтровать данные с помощью filter(). Допустим, мы хотим извлечь только цифры из строки.

Если хочется решить обратную задачу и получить только символы, но не цифры - то достаточно вызвать filterNot().

replace()/replaceRange()

Для замены отдельных символов или строк используется функция replace(). Заменим отдельные символы в строке.

Можно менять подстроки.

Вариант replace() с регулярным выражением. Создадим функцию перевода строки на "драконий" язык. В результате будет создана новая строка с нужными символами.

Можно заменять подстроки через replaceRange(), указывая нужный диапазон. Существуют две версии этого способа.

Конвертируем строку в дату

Есть также вариант с использованием DateTimeFormatter.

StringBuilder

У класса StringBuilder в Kotlin есть отдельная функция buildString(), которая поможет сократить количество кода для получения строки.

Читайте также: