JavaRush/Курсы/Модуль 1. Java Syntax/Работа со строками в Java

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

Открыта

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

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

Методы Описание
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 Beta,  9 уровень4 лекция
Недоступна
Обратный отсчет
В классе Solution в методе countDown() происходит обратный отсчет. Тебе нужно сделать так, чтобы между выводом текста в консоль была пауза в 1 секунду. В этом тебе поможет метод sleep(long) класса Thread.

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 Beta,  9 уровень4 лекция
Недоступна
Counter
В классе Solution реализуй метод printNumbers(), который выводит числа от 1 до 10 включительно с паузой между выводом каждого числа - 1,3 миллисекунды. В этом тебе поможет метод sleep(long, int) класса Thread.

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-e!"
"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"

9
Задача
Java Syntax Pro Beta,  9 уровень4 лекция
Недоступна
Таймер
В классе Solution реализуй метод setTimer(int, int, int, int, int), который засыпает на определенное время, используя соответствующие методы java.util.concurrent.TimeUnit.
Комментарии (449)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
apostol
Уровень 13
26 августа, 18:25
прошу прощения, поправьте где не прав import java.util.Scanner; public class Main { public static void main(String[] args) { String path = "/usr/java/jdk1.8/bin/"; String jdk13 = "jdk-13"; String a = path.replace("jdk1.8", jdk13); System.out.println(a); } } так можно решить?
Egorchik
Уровень 13
27 августа, 14:19
метод должен работать с любой строкой (то есть там может быть другая версия jdk), а у тебя работает только на примере
apostol
Уровень 13
позавчера, 09:50
благодарю, уже разобрался :)
improvement null в null
15 августа, 19:14
Если кто-то не понял почему в примере
"Good news everyone!".replaceAll("e.", "EX");
результат
"Good nEXs EXEXyonEX"
это потому что после e стоит точка. Она указывает сколько символов нужно удалить после заменных. Одна точка это 1 символ. 2 точки это два символа. Также будет если задать в парметр поиска строку. Поэтому строку с точкой задать не получится. Экранировать её тоже не получается. Что делать если нужно применить этот метод к строке с точкой не понятно.
Wren
Уровень 29
8 августа, 12:47
Для тех, кто застрял на последней задаче и не понимает, почему Ваша задача не валидируется: помните, что в версии JDK могут также встречаться и буквы.
Вадим З.
Уровень 12
13 августа, 07:11
Я бы добавил к вышесказанному: не нужно строго следовать условию задачи и менять версию 1.8 на 13. Нужно написать метод более универсальный, который меняет любую версию, принятую в первом параметре метода на рандомную версию, принятую во втором параметре метода.
1 августа, 09:52
В первой задаче в условии указано сначала http и https. Если в решении в ифах проверяешь сначала на http, затем на https, то проверку не проходит, меняешь ифы местами - проверку проходит. Серьезно?😰
Максим Technical Specialist
5 августа, 08:02
потому что http является подстрокой https. к прримеру код:
String url = "https://javarush.ru";
if (url.startsWith("http"))
    return "http";
Метод startsWith("http") найдет подстроку "http" в "https", вернет true и завершит выполнение. А все остальные условия проверяться не будут, потому что метод уже вернул значение.
Ramis
Уровень 14
8 августа, 10:16
А если ты на проверку дашь "http:" уже проблем не будет
Honeybadger
Уровень 14
21 августа, 21:58
можно попробовать реализовать через switch/case, но его ещё не проходили. хотя не уверен, что он работает иначе
10 июля, 06:57
System.out.print("Всем " + "Привет".replace("и", "ы"));
Ilya Klimchev Java Developer в spimex
4 июля, 13:44
... public static int getIndexFromFirstWord(String string, String word) { //напишите тут ваш код return string.indexOf(word); } public static int getIndexFromLastWord(String string, String word) { //напишите тут ваш код return string.lastIndexOf(word); } ... и это MEDIUM?))
Sergey Klokov
Уровень 27
18 июня, 13:14
Классно, что задачи основаны на примерах работы с url, а это уже it тема, а не просто строки из сказок поменять местами ))
Евгений
Уровень 17
16 июня, 15:50
Лекция зашла на все 100. Большое спасибо авторам. Если бы еще задачи были более насыщенные, был бы вообще ОГОНЬ!!!
Yulia Shevtsova
Уровень 15
14 мая, 15:33
Ну это вообще конечно не понятно, что значит index + 2? вообще беспонятия, чат gtp тоже не помог объяснить.😒 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);
Pavel
Уровень 12
14 мая, 19:22
в переменной индекс мы сохранили число - индекс первого вхождения "//", а в индекс2 мы ищем индекс первого вхождения "/", только уже пропустив те самые "//" (2 слэша, поэтому и +2), потому что иначе прога уткнется в тот же двойной слэш если непонятно объяснил - скажите на каком моменте стало непонятно P.S. по старой доброй традиции - второй индекс не включительно
Anton
Уровень 13
12 июня, 08:34
perplexity, она поумнее gpt очень помогает в прохождении и обучении
Vladislaav
Уровень 32
20 июля, 20:20
Блин, это ведь реально крутая тема. Спасибо!
Anonymous #3432420
Уровень 11
25 июля, 18:56
Я понял в первом случае мы ищем " // " а это два символа и получаем индекс первой / соответственно, когда мы начинаем искать уже index2, мы пропускаем не +1, а +2, т.к. в первом index у нас значение первой /, а не второй /
Mikhail Tabakaev Работает в ФБУЗ ЦГиЭКО
14 мая, 08:42
Здесь так и напрашивается какой-то контейнер, идентичный словарю в Пайтоне (отпала бы необходимость в бесконечной череде if-else if-...): Допустим, вы хотите написать программу, которая просит пользователя ввести путь к файлу и проверяет, что это за файл по его расширению. Тогда код такой программы мог бы выглядеть примерно так: