Обработка данных может состоять из достаточно большого количества шагов, которые нужно выполнить.
Возьмем для примера такую задачу: сформировать адрес страницы в интернете на основе введенного пользователем названия статьи. Такая задача часто возникает при публикации статей в блогах. Подобные адреса выглядят так:
https://ru.hexlet.io/blog/posts/iz-vahtovika-v-programmirovanie
Последняя часть здесь iz-vahtovika-v-programmirovanie создана автоматически кодом, который мы написали на Хекслете. Кстати, у нее есть специальное название – это слаг.
Какие шаги нужно выполнить? чтобы получить подобную строку? Вот лишь некоторые из них:
Часть шагов тут требует новых для нас знаний, поэтому мы их опустим. Остальные шаги будут выглядеть примерно так:
// Название, введенное пользователем. Для простоты на английском
var name = " How much is the fish? \n";
// вырезаем концевые пробелы и перенос строки
name = name.trim();
// Удаляем вопрос
name = name.replace("?", "");
// Заменяем пробелы на дефис
name = name.replace(" ", "-");
// Переводим в нижний регистр
name = name.toLowerCase();
System.out.println(name); // => how-much-is-the-fish
Если внимательно посмотреть на этот код, то можно заметить общий шаблон. Метод возвращает данные, которые мы присваиваем переменной, и дальше по цепочке обрабатывает их.
Этот шаблон можно упростить, убрав промежуточное перезаписывание переменной:
var name = " How much is the fish? ";
name = name.trim().replace("?", "").replace(" ", "-").toLowerCase();
System.out.println(name); // => how-much-is-the-fish
Благодаря тому, что каждый метод возвращает новую строку, мы можем продолжать обрабатывать ее, вызывая методы подряд. Если цепочка методов становится слишком длинной, то ее можно разбить на несколько строк:
name = name.trim()
.replace("?", "")
.replace(" ", "-")
.toLowerCase();
https://replit.com/@hexlet/java-basics-methods-chain
Несмотря на удобство этого механизма, им не стоит злоупотреблять. Промежуточные переменные могут упростить понимание кода.
Напишите код, который берет данные из переменной name
и выполняет капитализацию. В программировании так называют операцию, которая делает заглавной первую букву в слове, а все остальные переводит в нижний регистр. Например: heXlet => Hexlet. Программа должна выводить результат на экран.
Для извлечения частей слова, воспользуйтесь методом substring():
// 1 параметр – начальный индекс, 2 – конечный индекс (не включая)
"hexlet".substring(0, 1); // "h"
// По умолчанию до конца строки
"hexlet".substring(1); // "exlet"
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1import java.io.ByteArrayOutputStream;
2import java.io.FileDescriptor;
3import java.io.FileOutputStream;
4import java.io.PrintStream;
5
6import static org.assertj.core.api.Assertions.assertThat;
7
8class Test {
9 public static void main(String[] args) {
10 final var expected = "Hexlet";
11
12 ByteArrayOutputStream out = new ByteArrayOutputStream();
13 System.setOut(new PrintStream(out));
14
15 App.main(null);
16
17 final var actual = out.toString().trim();
18
19 System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
20 System.out.println(actual);
21
22 assertThat(actual).isEqualTo(expected);
23 }
24}
25
Решение учителя откроется через: