Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
// Демонстрация применения equals() и equalslgnoreCase(). class'equalsDemo { public static void main(String a r g s []) { String si = "Привет s2 = "Привет s3 = "Пока s4 = "ПРИВЕТ + " эквивалентно " + s2 + " -> " + s i .equals(s 2 )); System.out.println(si + " эквивалентно " + s3 + " -> " + s i .equals(s 3 )); Глава 15. Обработка строк 4 0 1 System.out.println(sl + " эквивалентно " + s4 + " -> " + s i .equals(s4) ) ; System.out.println(sl + " эквивалентно, игнорируя регистр " + s4 + " -> " + s l .equalsIgnoreCase(s 4 Вывод программы показан ниже. Привет эквивалентно Привет -> true Привет эквивалентно Good-bye -> false Привет эквивалентно ПРИВЕТ -> Привет эквивалентно, игнорируя регистр ПРИВЕТ -> Метод r e g io n M a tc h e s ( Этот метод сравнивает указанную часть строки с другой частью строки. Существует также перегруженная форма, которая игнорирует регистр символов при сравнении. Вот общая форма этих двух методов regionMatches(int н ачИ ндекс , String строка начИндексСтроки2, int количСимволов) boolean regionMatches(boolean игнорироватьРеги стр int начИндекс, String строка начИндексСтроки2, int количСимволов) В обеих версиях начИндекс задает индекс начала диапазона строки вызывающего объекта класса S t r i n g . Строка, подлежащая сравнению, передается в параметре строка. Индекс символа, начиная с которого нужно выполнять сравнение в параметре строка, передается в параметре начИндексСтроки2 , а длина сравниваемой подстроки — в параметре количСимволов. Во второй версии, если параметр игнорироватьРегистр содержит значение t r u e , регистр символов игнорируется. В противном случае регистр учитывается. Методы s t a r t s W i t h ( ) и e n d s W it h ( В классе S t r i n g определены два метода, представляющие собой более или менее специализированные формы метода r e g io n M a tc h e s (). Метод s t a r t W i t h () определяет, начинается ли заданный объект класса S t r i n g с указанной строки. В дополнение метод e n d s W ith () определяет, завершается ли объект класса S t r i n g заданным фрагментом. Эти методы имеют следующую общую форму startsWith(String строка) boolean endsWith(String строка) Здесь строка — фрагмент строки, наличие которого соответственно вначале или конце данного объекта класса S t r i n g нужно проверить. Если он присутствует, возвращается значение t r u e , иначе — значение f a l s e . Например, "Foobar".endsWith("bar") и "Foobar".startsWith("Foo") возвращают значение t r u e Вторая форма метода s t a r t s W i t h (), представленная здесь, позволяет задать начальный пункт startsWith(String строка int начИндекс) 4 0 Часть II. Библиотека Здесь начИндекс определяет индекс символа в исходной строке, с которого начинается поиск. Например 3) возвращает значение Сравнение метода e q u a l s ( ) и оператора Важно понимать различие между методом e q u a l s ( ) и оператором = = . Это два разных действия. Как было объяснено, метод e q u a l s () сравнивает символы внутри объекта класса S t r i n g . Оператор сравнивает две ссылки на объекты и определяет, ссылаются ли они на один и тот же экземпляр. В следующей программе показано, как два разных объекта класса S t r i n g могут содержать одинаковые символы, но ссылки на эти объекты при сравнении будут неэквивалентными) против = = class EqualsNotEqualTo { public static void main(String a r g s []) { String si = "Привет s2 = new String(sl); System.out.println(si + " equals " + s2 + " -> " + s i .equals(s 2 )); System.out.p r intln(si + " == " + s2 + " -> " + (si == Переменная si ссылается на экземпляр класса String, созданный присвоением литерала "Привет. Объект, на который ссылается переменная s2, создается с использованием переменной si в качестве инициализатора. Таким образом, содержимое обоих объектов класса String идентично, но это отличные друг от друга объекты. Это означает, что переменные si и s2 не ссылаются на один и тот же объекта потому неравны (при сравнении оператором ==), как доказывает вывод предыдущей программы. Привет equals Привет -> true Привет == Привет -> Метод c o m p a r e T o ( Зачастую недостаточно знать, что строки просто идентичны. Для приложений, выполняющих сортировку, нужно знать, какая из строк меньше, равна или больше следующей. Строка меньше другой, если она расположена передней в лексикографическом порядке. Строка больше другой, если расположена после нее. Метод по имени compareTo () служит этой цели. Он определен интерфейсом Comparable String. Метод имеет следующую общую форму, int compareTo(String строка) Здесь строка — это объект класса String, сравниваемый с вызывающим объектом класса String. Возвращаемый результат интерпретируется так, как показано в табл. 15.1. Глава 15. Обработка строк ДОЗ Таблица 15.1. Возвращаемый результат метода compareTo () Значение Описание Меньше нуля Вызывающая строка меньше строки Больше нуля Вызывающая строка больше строки str Нуль Две строки эквивалентны Ниже представлен пример программы, которая сортирует массив строк. Программа использует метод compareTo () для определения порядка в алгоритме пузырьковой сортировки Пузырьковая сортировка объектов String, class SortString { static String a r r [] = { "Now", "is", "the", "time", "for", "all", "good", "men", "to", "come", "to", "the", "aid", "of", "their", "country" }; public static void main(String a r g s []) { for(int j = 0 ; j < arr.length; j++) { for(int i = j + 1 ; i < arr.length; i++) { if(arr[i].compareTo(arr[j]) < 0) { String t = arr[j ] ; a r r [j ] = arr[i]; a r r [i] = t Выводом этой программы является список слов. Now aid all come country for good is men of the the their time to to Как можно заметить из вывода этого примера, метод compareTo () учитывает регистр букв. Слово "Now" идет прежде всех остальных, поскольку начинается с заглавной буквы, а заглавная буква имеет меньшее значение в наборе символов Если вы хотите игнорировать регистр символов при сравнении строк, используйте метод compareToIgnoreCase(). int compareToIgnoreCase(String строка b)bЭтот метод возвращает тот же результат, что и метод compareTo () , за исключением того, что регистр символов игнорируется. Вы можете попытаться подста 4 0 Часть II. Библиотека вить этот метод в предыдущую программу. После этого слово "Now" уже не будет первым в списке. Поиск строк Класс S t r i n g предлагает два метода, которые позволяют выполнять поиск в строке определенного символа или подстроки. • Метод in d e x O f () — ищет первое вхождение символа или подстроки. • Метод l a s t In d ex O f () — ищет последнее вхождение символа или подстроки. Эти два метода перегружены несколькими разными способами. Во всех случаях эти методы возвращают позицию в строке (индекс, где символ или подстрока была найдена, либо значение -1 — в случае неудачи. Чтобы найти первое вхождение символа, применяется следующая форма indexOf(char символ) Чтобы найти последнее вхождение символа, применяется такая форма lastIndexOf(char символ) Здесь символ — это символ, который нужно искать. Чтобы найти первое или последнее вхождение подстроки, применяется следующая форма indexOf(String строка строка) Здесь строка задает искомую подстроку. Вы можете указать начальную позицию для поиска, воспользовавшись следующими формами indexOf(int символ int начИ ндекс) int lastlndexOf(int символ int начИндекс) int indexOf(String строка int начИндекс) int lastlndexOf(String строка int начИндекс) Здесь начИндекс задает начальную позицию поиска. Для метода in d e x O f () поиск начинается от начИндекс до конца строки, а для метода l a s t l n d e x O f () — от начИндекс до нуля. Следующий пример показывает, как использовать различные индексные методы для поиска внутри строки Демонстрация использования indexOf() и lastlndexOf(). class indexOfDemo { public static void main(String a r g s []) { String s = "Now is the time for all good men " + "to come to the aid of their country."; System.out.println(s); System.out.println("indexOf(t ) = " + s .indexOf(1t ')); System.out.println("lastlndexOf(t ) = " + s .lastlndexOf('t ')); System.out.println("indexOf(the) = " + s .indexOf("the")); System.out.println("lastlndexOf(the) = " + s .lastlndexOf("the")); System.out.println("indexOf(t, 10) = " + s .indexOf('t 1, 10)); System.out.println("lastlndexOf(t, 60) = " + s .lastlndexOf('t 1, 60)); System.out.println("indexOf(the, 10) = " + Глава 15. Обработка строк 4 0 5 s .indexOf("the" , 10)); System.out.println("lastlndexOf(the, 60) = " + s .lastlndexOf("t h e ", Ниже показан вывод этой программы . Now is the time for all good men to come to the aid of their country. indexOf(t) = 7 lastlndexOf(t) = 65 indexOf(the) = 7 lastlndexOf(the) = 55 indexOf(t, 10) = 1 1 lastIndexOf(t , 60) = 55 indexOf(the, 10) = 44 lastlndexOf(the, 60) = Модификация строк П оскольку объекты класса S t r i n g неизм еняем ы , всякий раз, когда вы хотите их модифицировать, следует либо скопировать их содержимое в объект класса S t r i n g B u f f e r или S t r i n g B u i l d e r , либо воспользоваться одним из следующих методов класса S t r i n g , которые создают новые копии строк с внесенными модификациями. Здесь описаны простейшие из этих методов. Метод s u b s t r i n g ( Вы можете извлечь подстроку, используя метод s u b s t r i n g ( ) . Этот метод имеет две формы. Первая форма такова substring(int начИндекс) Здесь начИндекс указывает индекс, с которого начнется подстрока. Эта форма возвращает копию подстроки, которая начинается с позиции начИндекс и продолжается до завершения вызывающей строки. В торая формам етода s u b s t r i n g () позволяет указать как начальный, таки конечный индексы подстроки substring(int начИндекс, int конИндекс) Зд есь начИндекс указывает индекс, скот о ро гона ч нет с я подстрока, а конИндекс — точку конца подстроки. Возвращаемая строка содержит все символы, отпер вой позиции и доп осл ед ней, исключая ее. В следующей программе метод s u b s t r i n g () используется для замены в строке всех экземпляров одной подстроки другой Замена подстроки class StringReplace { public static void main(String a r g s []) { String org = "This is a test. This is, too."; String search = "is"; String sub = "was"; String result = ""; int i ; do { // замена всех совпадающих подстрок System.out.println(org); i = o r g .indexOf(search); if (i != -1) { result = o r g .substring(0, i); } } 4 0 Часть II. Библиотека Java result = result + sub; result = result + o r g .substring(i + search.length()); org = result; } } w h i l e (i != -1) Вывод этой программы показан ниже is a test. This is, too. Thwas is a test. This is, too. Thwas was a test. This is, too. Thwas was a test. Thwas is, too. Thwas was a test. Thwas was, Метод c o n c a t ( Вы можете соединить две подстроки, используя метод c o n c a t ( ), как показано ниже conc a t (String строка) Этот метод создает новый строковый объект, содержащий вызываемую строку, к концу которой добавлено содержимое параметра строка Метод c o n c a t () выполняет туже функцию, что и оператор +. Например, следующий код помещает символы "o n etw o " в строку s2. String si = "one"; String s2 = s i .concat("tw o "Код создает тот же результат, что и представленная ниже последовательность si = "one"; String s2 = si + "Метод r e p l a c e ( Этот метод имеет две формы. Первая заменяет в исходной строке все вхождения одного символа другим replace(char исходный char замена) Здесь параметр исходный задает символ, который должен быть заменен символом замена. Возвращается результирующая строка. Например s = "Hello".replace('1', 'w ' помещает в строку s слово "Hewwo". Вторая форма метода r e p l a c e () заменяет одну последовательность символов на другую replace(CharSequence исходный CharSequence замена) Эта форма появилась в J2SE Метод t r i m ( С помощью этого метода возвращается копия вызывающей строки, из которой удалены всеведущие и завершающие пробелы. Он имеет следующую общую форму Вот пример s = " Hello World ".trim(); Глава 15. Обработка строк Л 0 В результате в строку s будет помещен текст " Hello Метод trim () достаточно удобен в составе других команд. Например, следующая программа приглашает пользователя ввести название штата, а затем отображает название города — столицы штата. Она использует метод trim () для удаления всех предваряющих и завершающих пробелов, которые могут быть непреднамеренно введены пользователем Использование trim() для обработки команд import java.io.*; class UseTrim { public static void main(String a r g s []) throws IOException { // Создается BufferedReader с использованием System.in BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String Введите 'стоп' для завершения r i Введите штат "); do { str = b r .readLine(); str = str.trim(); // удалить пробелы i f (s t r Иллинойс r i Столица - Спрингфилд else i f (s t r .equals("Миссури")) System.out.println("Столица — Джефферсон-сити."); else if(str.equals("Калифорния")) System.out.println("Столица- Сакраменто i f (s t r .equals("Вашингтон")) System.out.println("Столица - Олимпия / . . } w h i l e (!s t r .equals("стоп")); } Преобразование данных с помощью метода valueOf ( Метод valueOf () преобразует данные из внутреннего представления в читабельную для пользователя форму. Это статический метод, который перегружен в классе String для всех встроенных в Java типов таким образом, что каждый тип может быть правильно преобразован в строку. Метод valueOf () перегружен и для типа Obj ect, поэтому объект типа любого класса, который вы создадите, также может использоваться в качестве аргумента. (Вспомните, что класс Object — суперкласс для всех классов) Ниже показаны некоторые его формы String valueOf(double число) static String valueOf(long число) static String valueOf(Object объект) static String valueOf(char символы []) Как упоминалось ранее, метод valueOf () вызывается тогда, когда требуется строковое представление некоторого другого типа данных — например, при операции конкатенации. Вы можете вызывать этот метод непосредственно с любым типом данных и получать адекватное представление типа String. Все элементарные типы преобразуются в их общее строковое представление. Любой объект, который вы можете передать методу valueOf () , возвратит результат 4 0 Часть II. Библиотека методу toString () объекта. Фактически вы можете просто вызвать метод to String () и получить тот же результат. Для большинства массивов метод valueOf () возвращает зашифрованную строку, означающую, что это массив определенного типа. Для массивов типа char, однако, создается объект класса String, содержащий все символы массива типа char. Он имеет следующую форму String valueOf(char символы int начИндекс, int количСимволов) Здесь символы — это массив, который содержит символы, начИндекс — начальная позиция в массиве, с которой начинается подстрока, а количСимволов указывает длину подстроки. Изменение регистра символов в строке Метод toLowerCase () преобразует все символы строки из верхнего регистра в нижний. Метод toUpperCase () преобразует все символы строки из нижнего регистра в верхний. Небуквенные символы, такие как десятичные цифры, остаются неизменными. Вот простейшая форма этих методов toLowerCase() String Оба метода возвращают объект класса String, содержащий эквивалент вызывающей строки соответственно в нижнем или верхнем регистре. В обоих случаях преобразованием управляет заданный по умолчанию региональный язык. Ни же показан пример, в котором используются методы toLowerCase () и toUpperCase(). // Демонстрация toUpperCase() и toLowerCase(). class ChangeCase { public static void main(String args[]) { String s = "Это тест n t l n (Исходная строка " + s ) ; String upper = s .toUpperCase(); String lower = s Верхний регистр " + Нижний регистр " + Вывод приведенной выше программы. |