Книга: Основы программирования с Java
Назад: Вопросы
Дальше: File IO

Работа со строками

Метод length() используется для подсчета количества символов в строке.

Обратите внимание, что length() строки является методом, так как имеется пара скобок, в отличие от length для массива, которая является переменной экземпляра.





В этом примере целой переменной size будет присвоено значение 6, потому что символьная строка "Мартин" имеет 6 символов.

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







Метод charAt можно использовать для доступа к символу по индексу местоположения, который указан в параметре.

Важно помнить, что также, как и в массиве, здесь индекс начинается с 0.

Так studentName.charAt(0) с параметром 0 вернет один символ «М».

Это первый символ в строке, который затем присваивается переменной firstChar.

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







Первый параметр "i" указывает на начальный индекс для извлечения подстроки, а второй параметр "j" указывает, что j-1 является индексом последнего символа строки, который должен быть извлечен.

Это немного запутанно, но Вы просто должны помнить, что подстрока, которая должна быть извлечена, начинается с индекса i и до индекса j-1, а не j.

Следует помнить, что последний индекс не j, а j-1.

В этом примере, вызывая метод substring с аргументами 0 и 3, извлекается подстрока от индекса 0 до 3-1 или 2.

Результаты – новая строка с тремя символами.

Затем результат присваивается новой String переменной subStr.

Альтернативный способ использовать метод substring, это указать только один параметр целого типа.







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

В этом примере, вызывая метод substring в studentName с одним аргументом 3, будет извлечена подстрока, которая начинается с индекса 3 и до конца строки.

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

Как я уже упоминал, строки являются неизменными.

Это означает, что они не могут быть изменены, как только они будут созданы.

Так substring не изменит значение исходной строки, из которой метод substring извлек подстроку.

Вместо этого, он создаст новую строку.







Чтобы проиллюстрировать это, используя предыдущий пример, переменной studentName присваивается строка "Мартин".

Как и раньше, когда метод substring с одним параметром, целым числом 3, применяется к studentName, вместо изменения памяти для символьной строки "Мартин" на "tin", что не допускается, так объект String является неизменяемым, создается новая строка "tin".

Так что, все, что делает этот код – это новая строка "tin" просто исчезнет после того, как создастся.

Предположим, что если эта новая строка снова присвоится переменной studentName, это будет допустимо, учитывая то, что строка является неизменной?

Вы можете подумать об этом.

Ответ: да, так как переменная studentName является ссылочной переменной, и она не является финальной.

Так что оператор присваивания назначит переменной studentName указывать на новый объект String со значением "tin", вместо изменения значения исходной строки «Мартин».

Поскольку объекты String представлены ссылочными переменными, сравнение двух строк на равенство с помощью оператора == может вернуть false, даже если две строки имеют одинаковую последовательность символов, потому что две последовательности символов, определяемых двумя строковыми переменными, могут занимать различные области памяти.







Например, применение substring(1) к символьной строке "abcd", начиная с индекса 1, вернет символьную строку "bcd", как показано здесь.

Но когда сравнение производится с использованием логического равно с другой символьной строкой "bcd", сравнение вернет значение false.

Поэтому следует использовать метод equals() для сравнения двух строк.







Этот пример аналогичен предыдущему примеру, за исключением того, что используется метод equals() и значение true будет возвращено в качестве результата.

Операция, которая очень часто используется для строки, это упорядочить ее в алфавитном порядке.

В информатике, упорядочение делается с помощью лексикографического порядка, который похож на алфавитный порядок, но это не совсем то же самое, потому что набор символов в строках может включать в себя другие символы, отличные от алфавита, и сравнение фактически выполняется на основе ASCII или Unicode.







Метод compareTo сравнивает две строки лексикографически и возвращает целое число, больше 0, если str1 больше, чем str2 в соответствии с кодировкой ASCII, он возвращает 0, если они одинаковы, и возвращает отрицательное значение, если str1 меньше, чем str2.

Я буду использовать примеры в таблице, чтобы показать, как метод compareTo работает.







Что этот метод будет сделать, так это сравнивать символы в двух строках по одному.

Он будет возвращать соответствующий результат, если символы в соответствующих местах не равны друг другу.

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

Во втором примере, первые символы не одинаковые, хотя они оба «а», один в нижнем регистре, а другой в верхнем регистре, и в представлении ASCII, заглавные буквы стоят перед строчными буквами, и так как строчный символ больше верхнего регистра, возвращается целое положительное число.

При сравнении строк 127 и 409, они сравниваются как строки, а не как числа.

Поскольку представление ASCII для 1 предшествует 4, возвращаемое значение меньше 0.

В четвертом примере, поскольку все символы одинаковы, возвращается значение 0.

Когда первая строка является подстрокой второй строки, как в 5-м примере, возвращается значение меньше 0.

В последнем примере, 3 сравнивается с 12345, и если бы они являлись числами, 12345 явно больше, чем 3, но для сравнения строк, начиная с первого символа, 3 больше, чем 1, и строка 3 рассматривается как больше, чем строка 12345 и возвращается положительное целое число.

Объединение строк – это операция, которая часто используется для String.

И объединение строк означает присоединение одной строки в конец другой строки.

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

Например, если name инициализируется как строка символов со значением, равным TC.







Когда "My name is " добавляется к name, вывод будет «My name is TC».

Javа класс String, также обеспечивает метод с именем concat для объединения строк.

Метод concat будет присоединять строку, указанную в качестве аргумента, к концу объекта String, который используется при вызове метода.







Так что, если метод concat применить к объекту String " My name is " с name, будет возвращена комбинированная строка "My name is TC".

Еще двумя широко используемыми методами являются toLowerCase и toUppercase, которые преобразуют все символы в строках в нижний регистр или верхний регистр соответственно.







В этом примере, строка символов "AbCdE" имеет три заглавные буквы А, С и E и две строчные буквы b и d. И применением метода toLowerCase к этой строке, будет возвращена строка со всеми строчными abcde.

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

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

Мы только что обсудили ряд полезных методов класса String.

На самом деле существует гораздо больше методов, и вы можете узнать более подробную информацию об этих методах на сайте Java, который поддерживается Oracle.

Вот список методов, которые вы можете здесь увидеть (https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html).







Это методы charAt(), compareTo(), concat(). Это метод length(), который предназначен для выяснения длины строки, это две различные версии метода substring(), методы toLowerCase (), toUpperCase (), и многое другое.

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







Например, возьмем 6-ти символьную строку Мартин, помня, что индекс элементов строки начинается с 0.

В этом примере, последний индекс, это 5, то есть, на единицу меньше, чем длина строки.

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

Так обратное Martin является Nitram.

Обратите внимание, что регистр символов сохраняется, так что M в конце является заглавной буквой.

Давайте посмотрим на другой пример, здесь Ханна является строкой, также с 6 символами.

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

Хотя большая буква H будет теперь в конце.

Такая строка, как эта, называется палиндромом.

Палиндром – это слово или предложение, которое читается одинаково в обоих направлениях.

Я вернусь к этому позже при определении, является ли строка палиндромом.

Давайте подумаем о том, как мы можем обратить вспять строку? Существует много способов это сделать.

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

Можно на самом деле также начать с последнего символа, если вы хотите.







Вот метод для реверса строки.

Метод называется reverseString и принимает один параметр типа String и возвращает строку в качестве результата.

Так как мы должны создать перевёрнутую строку, локальная переменная revStr типа String необходима для хранения промежуточных результатов.

Переменная revStr инициализируется пустой строкой.

Обратите внимание, что нет ничего между парой двойных кавычек, даже нет пробела.

Пустая строка не то же самое, как строка с пробелом, так как пробел представляется в виде символа.

Основная работа в этом методе осуществляется for циклом.

Индекс for цикла будет проходить через каждый элемент строки по одному, начиная с индекса 0 или первого символа.

Цикл закончится, если i станет не меньше, чем длина строки, которая определяется методом length.

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

Давайте рассмотрим пример, чтобы проиллюстрировать, как работает этот цикл.

Исходная строка имеет «Martin» в качестве своего значения и revStr является пустой строкой.

Когда цикл имеет первое вхождение, i = 0, тогда метод charAt в операторе присваивания будет извлекать 0-й элемент, от входной строки или заглавную букву М, которая затем объединится с revStr с помощью оператора плюс.

Вы также можете использовать метод concat, если вы хотите.

Объединение приведет к строке, состоящей из заглавной буквы М.

В следующий раз в цикле, переменной i присваивается значение 1.







Внутри цикла, метод charAt будет извлекать символ входной строки, индексированный 1 или символ «а», который затем объединяется с revStr или M.

Обратите внимание, что порядок конкатенации важен в данном случае, так как символ «а» ставится перед М, потому что мы строим перевёрнутую строку.

Полученная revStr в этой итерации цикла будет «аМ».

Этот процесс будет продолжаться и конечный результат Nitram присвоится переменной revStr.

Индекс i равный 6 будет проверен, меньше ли он, чем длина строки, и результат будет в этом случае false, так что цикл завершится.

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

Это очень короткая программа, вы можете ввести ее в и протестировать ее в среде IDEA, если вы хотите.

Вы можете также поэкспериментировать с использованием метода сoncat вместо оператора +.

Как я упоминал ранее, палиндром – это слово или фраза, которая читается одинаково в обоих направлениях.

Это пример того, что мы видели ранее, Hannah читается одинаково вперед и назад, так что это палиндром.







Еще один пример, Madam также читается одинаково в обоих направлениях.

В качестве упражнения, я хочу, чтобы вы использовали метод реверса строки, который мы только что обсуждали, чтобы написать логический метод isPalindrome, который возвращает true, если входной параметр является палиндромом и возвращает false в противном случае.







Обратите внимание, что мы можем игнорировать регистры при определении того, является ли входной параметр палиндромом.

В предыдущем примере Ханна, заглавную H можно рассматривать так же, как маленькую букву h.

Вы можете также проверить, какие другие методы доступны в классе String.

Если вы используете методы approach, это может быть реализовано в одном выражении return.

Назад: Вопросы
Дальше: File IO