JavaRush /Курсы /Java Syntax New Beta /Работа со строками в Java

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

Java Syntax New Beta
9 уровень , 5 лекция
Открыта

1. Сравнение строк

Сравнение — одна из самых частых вещей, которая делается со строками. У класса String более десяти различных методов, которые используются для сравнения строк со строками. Ниже мы рассмотрим 8 основных.

Методы Описание
boolean equals(String str)
Строки считаются равными, если все их символы совпадают.
boolean equalsIgnoreCase(String str)
Сравнивает строки, игнорируя регистр (размер) букв
int compareTo(String str)
Сравнивает строки лексикографически. Возвращает 0, если строки равны. Число меньше нуля, если текущая строка меньше строки-параметра. Число больше нуля, если текущая строка больше строки-параметра
int compareToIgnoreCase(String str)
Сравнивает строки лексикографически, игнорирует регистр. Возвращает 0, если строки равны. Число меньше нуля, если текущая строка меньше строки-параметра. Число больше нуля, если текущая строка больше строки-параметра
boolean regionMatches(int toffset, String str, int offset, int len)
Сравнивает части строк
boolean startsWith(String prefix)
Проверяет, что текущая строка начинается со строки prefix
boolean endsWith(String suffix)
Проверят, что текущая строка заканчивается на строку suffix

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

Код Примечания
Scanner console = new Scanner(System.in);
 String path = console.nextLine();

if (path.endsWith(".jpg") || path.endsWith(".jpeg"))
{
   System.out.println("Это Jpeg!");
}
else if (path.endsWith(".htm") || path.endsWith(".html"))
{
   System.out.println("Это HTML-страница");
}
else if (path.endsWith(".doc") || path.endsWith(".docx"))
{
   System.out.println("Это документ Word");
}
else
{
   System.out.println("Неизвестный формат");
}
Создание объекта Scanner
Чтение строки с консоли

Проверяем, что строка path оканчивается на заданную строку

9
Задача
Java Syntax Pro, 9 уровень, 5 лекция
Недоступна
Побитовые операции
Закомментируй ненужные строки кода, чтобы на экран вывелась цифра 5. Примечание: нужно закомментировать только две строки.

2. Поиск подстрок

Вторая по популярности операция после сравнения строк — это поиск одной строки в другой. Для этого у класса String тоже есть немного методов:

Методы Описание
int indexOf(String str)
Ищет строку str в текущей строке. Возвращает индекс первого символа встретившейся строки.
int indexOf(String str, int index)
Ищет строку str в текущей строке, пропустив index первых символов. Возвращает индекс найденного вхождения.
int lastIndexOf(String str)
Ищет строку str в текущей строке с конца. Возвращает индекс первого вхождения.
int lastIndexOf(String str, int index)
Ищет строку str в текущей строке с конца, пропустив index первых символов.
boolean matches(String regex)
Проверяет, что текущая строка совпадает с шаблоном, заданным регулярным выражением.

Методы indexOf(String) и indexOf(String, index) часто используются в паре. Первый позволяет найти первое вхождение переданной подстроки в текущей строке. А второй метод позволяет найти второе, третье и т.д. вхождения за счет того, что пропускает первые index символов.

Допустим, у нас есть url типа такого: «https://domen.com/about/reviews», и мы хотим заменить имя домена на javarush.com. Домены в урлах могут быть разными, но мы знаем, что:

  • Перед именем домена идут два слеша «//»
  • После имени домена идет одинарный слеш /

Вот как бы выглядел код такой программы:

Код Примечания
Scanner console = new Scanner(System.in);
String path = console.nextLine();

int index = path.indexOf("//");
int index2 = path.indexOf("/", index + 2);

String first = path.substring(0, index + 2);
String last = path.substring(index2);

String result = first + "javarush.com" + last;
System.out.println(result);
Создание объекта Scanner
Чтение строки с консоли

Получаем индекс первого вхождения строки //
Получаем индекс первого вхождения строки /, но ищем только после символов //.
Получаем строку от начала и заканчивая символами //
Получаем строку от / и до конца.

Склеиваем строки и новый домен.

Методы lastIndexOf(String) и lastIndexOf(String, index) работают точно так же, только поиск ведется с конца строки к началу.


9
Задача
Java Syntax Pro, 9 уровень, 5 лекция
Недоступна
Swap по-новому
В классе Pair реализуй метод swap() так, чтобы он менял местами значения переменных x и y. Можно использовать только операции: 1. Исключающее или. 2. Присваивание. 3. Исключающее или с присваиванием. Не оставляй комментарии, не меняй остальной код.

3. Создание подстрок

Кроме сравнения строк и поиска подстрок, есть еще одно очень популярное действие — получение подстроки из строки. В предыдущем примере вы как раз видели вызов метода substring(), который возвращал часть строки.

Вот список из 8 методов получения подстрок из текущей строки:

Методы Описание
String substring(int beginIndex, int endIndex)
Возвращает подстроку, заданную интервалом символов beginIndex..endIndex.
String repeat(int count)
Повторяет текущую строку count раз
String replace(char oldChar, char newChar)
Возвращает новую строку: заменяет символ oldChar на символ newChar
String replaceFirst(String regex, String replacement)
Заменяет в текущей строке подстроку, заданную регулярным выражением.
String replaceAll(String regex, String replacement)
Заменяет в текущей строке все подстроки, совпадающие с регулярным выражением.
String toLowerCase()
Преобразует строку к нижнему регистру
String toUpperCase()
Преобразует строку к верхнему регистру
String trim()
Удаляет все пробелы в начале и конце строки

Вот краткое описание существующих методов:

Метод substring(int beginIndex, int endIndex)

Метод substring возвращает новую строку, которая состоит из символов текущей строки, начиная с символа под номером beginIndex и заканчивая endIndex. Как и во всех интервалах в Java, символ с номером endIndex в интервал не входит. Примеры:

Код Результат
"Привет".substring(0, 3);
"При"
ривет".substring(1, 4);
"рив"
ривет".substring(1, 6);
"ривет"
ривет".substring(1);
"ривет"

Если параметр endIndex не указывается (а так можно), подстрока берется от символа beginIndex и до конца строки.

Метод repeat(int n)

Метод repeat просто повторяет текущую строку n раз. Пример:

Код Результат
"Привет".repeat(3);
"ПриветПриветПривет"
"Привет".repeat(2);
"ПриветПривет"
"Привет".repeat(1);
"Привет"
"Привет".repeat(0);
""

Метод replace(char oldChar, char newChar)

Метод replace() возвращает новую строку, в которой все символы oldChar заменены на символ newChar. Длина строки при этом не меняется. Пример:

Код Результат
"Привет".replace('Я', 'я');
"Привет"
"Привет".replace('т', 'д');
"Привед"
"Привет".replace('и', 'е');
"Превет"
"Привет".replace('и', 'ы');
"Прывет"

Методы replaceFirst() и replaceAll()

Метод replaceAll() заменяет все вхождения одной подстроки на другую. Метод replaceFirst() заменяет первое вхождение переданной подстроки на заданную подстроку. Строка, которую заменяют, задается регулярным выражением. Разбирать регулярные выражения мы будем в квесте Java Multithreading.

Примеры:

Код Результат
"Good news everyone!".replaceAll("e.", "EX");
"Good nEXs EXEXyonEX"
"Good news everyone!".replaceAll("o.", "-o-");
"G-o-d news every-o-ne!"
"Good news everyone!".replaceFirst("e.", "EX");
"Good nEXs everyone!"
"Good news everyone!".replaceFirst("o.", "-o-");
"G-o-d news everyone!"

Методы toLowerCase() и toUpperCase()

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

Метод trim()

Метод trim() удаляет у строки пробелы с начала и с конца строки. Пробелы внутри строки никто не трогает. Примеры:

Код Результат
"     ".trim();
""
"Привет".trim();
"Привет"
" Привет\n как дела?\n   ".trim();
"Привет\n как дела?\n"
"  Пароль\n   \n ".trim();
"Пароль\n   \n"

Комментарии (39)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Egor_Myrocnhuk Уровень 1
1 апреля 2023
У сравнения строки не совсем корректно показывать метод сканер и не говорить ,что мы туда напишем ибо тогда совсем нет понимания какую информацию мы обрабатываем и смысл от неё. И чутка плохие примеры с .trim() или сделайте больше или сделайте там например для " Привет ", " При вет ".
Никита Уровень 11
27 августа 2022
Задачки и вправду уже гораздо интереснее, спасибо!
Grock Уровень 44
26 июля 2022
Не хватает пояснения, что в выражении:

"Good news everyone!".replaceAll("o.", "-o-"); //Вывод: "G-o-d news every-o-e!"
точка после "o" означает, количество символов после "o", которые будут перекрываться заменяемыми символами. Т.е. выражение "o." означает, что вместо "o" будет "-o", а следующий за "o" символ будет заменен на "-". Таким образом, если в рассматриваемом выражении добавить после "o" еще одну точку "o..", то вывод на экран будет другим:

"Good news everyone!".replaceAll("o..", "-o-"); //Вывод: "G-o- news every-o-!"
Соответственно, если убрать точки после "o" совсем, то "o" заменится на 3 символа "-o-":

"Good news everyone!".replaceAll("o", "-o-"); //Вывод: "G-o--o-d news every-o-ne!"
Aлександр 52 Уровень 21
18 декабря 2022
Очень полезный комментарий. Спасибо!
Val Prysov Уровень 30
30 апреля 2022
int compareTo(String str) - описание метода неверное. данный метод выполняет равнение первых символов сроки в числовом эквиваленте в описании compareToIgnoreCase то же самое. прошу исправить Compares two strings lexicographically. Returns an integer indicating whether this string is greater than (result is > 0), equal to (result is = 0), or less than (result is < 0) the argument. String one = "a"; String two = "c"; System.out.println(one.compareTo(two)); // -2
Nixis Уровень 10
15 декабря 2022
Сравнение не просто первых, а первых отличающихся друг от друга символов. И еще. Если строки одинаковы вначале, но одна строка длиннее другой, функция возвращает разницу в длине. Короче, как я понял, с помощью compareTo можно легко расставить строки , как они могли бы располагаться в словаре)
Кирилл Уровень 29
13 марта 2022
Почему в этой задаче в int index2 = path.indexOf("/", index + 2); обязательно index+2? Я дебажил этот код и если 2 не прибавишь то index2 остается равной 6 а не 16!НОО!! 6+2=8 По какому принципу находится второй бэкслэш?
Anatoly Mischenko Уровень 1
22 августа 2022
да так как функция пропускает первые индексы у нас их 6 и начинает с шестого и там слеш он его берет и выводит, а если начат с восьмого то следующий только 16 вот и все.
Кирилл Уровень 29
23 августа 2022
Дела давно минувших дней)) Но комент отличный! Думаю что он сможет помочь тем кто не вкурил, так же как и я когда-то!!!
Samanter Уровень 14
2 февраля 2022
Подскажите пожалуйста: какой метод можно использовать чтобы найти символЫ по индексу?
Ренат Уровень 39
8 февраля 2022
char charAt(int index) — возвращает символ, расположенный по указанному индексу строки.
Alexey Уровень 15
17 января 2022
Много всяких методов, так сразу и не запомнить
Anonymous #2721182 Уровень 29
13 ноября 2021
Как всегда, решить задачу можно 3-4 простыми методами, но правильное решение периодически прям отстой.
Dimsos Уровень 29
4 октября 2021
Задачу "Обновление пути" решил тремя разными способами) Но.. задача не принималась и пришлось посмотреть ответ. Там был четвертый способ который я не понимал как работает и главное в том , что разобравшись, я в полной мере понял как работают методы приведенные выше в таблице! Очень этому рад)
Anonymous #2885293 Уровень 15
27 ноября 2021
Но всё-таки непонятно, почему не принимаются другие способы, если они выводят то, что надо. По какому критерию отсеивают решения....
Finding Happiness Уровень 13
26 декабря 2021
По критерию усвоения нового материала
Masha Frolova Уровень 22
24 сентября 2021
"String repeat(int count) - Повторяет текущую строку n раз " может, count раз?
PERFORATTOR Уровень 19
31 октября 2021
n - обозначение множества всех натуральных чисел.
FuryCydonian Уровень 22
23 января 2022
N - обозначение множества натуральных чисел, а тут явно опечатка.