Java: Агрегация данных (Строки)
Агрегация применяется не только к числам, но и к строкам. Под агрегацией строк понимают задачи, в которых заранее неизвестно, что содержат строки и какого они размера.
При агрегации строка формируется динамически. Представьте себе метод, который повторяет строку указанное количество раз. В Java для этого есть готовые средства, но здесь мы посмотрим, как такой повтор устроен внутри:
App.repeat("hexlet", 3); // "hexlethexlethexlet"Принцип работы этого метода довольно простой. В цикле происходит наращивание строки указанное количество раз:
public static String repeat(String text, int times) {
// Нейтральный элемент для строк — пустая строка
var result = "";
var i = 1;
while (i <= times) {
// Каждый раз добавляем строку к результату
result = result + text;
i = i + 1;
}
return result;
}Распишем выполнение этого кода по шагам:
// Для вызова repeat("hexlet", 3);
var result = "";
result = result + "hexlet"; // "hexlet"
result = result + "hexlet"; // "hexlethexlet"
result = result + "hexlet"; // "hexlethexlethexlet"Наглядно процесс наращивания строки выглядит так:
repeat("hexlet", 3):
i=1: result = "" + "hexlet" = "hexlet"
i=2: result = "hexlet" + "hexlet" = "hexlethexlet"
i=3: result = "hexlethexlet" + "hexlet" = "hexlethexlethexlet"
└── результатЗдесь работают сразу две переменные. Счетчик i управляет количеством повторов и останавливает цикл, когда повторов набралось times. Переменная result хранит накопленную строку и отдает ее вызывающему коду после цикла.
Нейтральный элемент
Чтобы наращивание заработало, нужно стартовое значение. Для строк им служит пустая строка "".
Ее называют нейтральным элементом, потому что при конкатенации она ничего не меняет:
System.out.println("" + "abc"); // => abc
System.out.println("abc" + ""); // => abcПоэтому пустая строка всегда стоит в начале при агрегации строк. С нее цикл начинает наращивание, а дальше на каждой итерации добавляет к результату очередной кусок.
Задание
Реализуйте метод joinNumbersFromRange(), который объединяет все числа из диапазона в строку:
App.joinNumbersFromRange(1, 1); // "1"
App.joinNumbersFromRange(2, 3); // "23"
App.joinNumbersFromRange(5, 10); // "5678910"Полезное
Java: Агрегация данных (Строки)
Агрегация применяется не только к числам, но и к строкам. Под агрегацией строк понимают задачи, в которых заранее неизвестно, что содержат строки и какого они размера.
При агрегации строка формируется динамически. Представьте себе метод, который повторяет строку указанное количество раз. В Java для этого есть готовые средства, но здесь мы посмотрим, как такой повтор устроен внутри:
App.repeat("hexlet", 3); // "hexlethexlethexlet"Принцип работы этого метода довольно простой. В цикле происходит наращивание строки указанное количество раз:
public static String repeat(String text, int times) {
// Нейтральный элемент для строк — пустая строка
var result = "";
var i = 1;
while (i <= times) {
// Каждый раз добавляем строку к результату
result = result + text;
i = i + 1;
}
return result;
}Распишем выполнение этого кода по шагам:
// Для вызова repeat("hexlet", 3);
var result = "";
result = result + "hexlet"; // "hexlet"
result = result + "hexlet"; // "hexlethexlet"
result = result + "hexlet"; // "hexlethexlethexlet"Наглядно процесс наращивания строки выглядит так:
repeat("hexlet", 3):
i=1: result = "" + "hexlet" = "hexlet"
i=2: result = "hexlet" + "hexlet" = "hexlethexlet"
i=3: result = "hexlethexlet" + "hexlet" = "hexlethexlethexlet"
└── результатЗдесь работают сразу две переменные. Счетчик i управляет количеством повторов и останавливает цикл, когда повторов набралось times. Переменная result хранит накопленную строку и отдает ее вызывающему коду после цикла.
Нейтральный элемент
Чтобы наращивание заработало, нужно стартовое значение. Для строк им служит пустая строка "".
Ее называют нейтральным элементом, потому что при конкатенации она ничего не меняет:
System.out.println("" + "abc"); // => abc
System.out.println("abc" + ""); // => abcПоэтому пустая строка всегда стоит в начале при агрегации строк. С нее цикл начинает наращивание, а дальше на каждой итерации добавляет к результату очередной кусок.
Задание
Реализуйте метод joinNumbersFromRange(), который объединяет все числа из диапазона в строку:
App.joinNumbersFromRange(1, 1); // "1"
App.joinNumbersFromRange(2, 3); // "23"
App.joinNumbersFromRange(5, 10); // "5678910"Полезное
Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
class AppTest {
public static void main(String[] args) {
assertThat(App.joinNumbersFromRange(2, 2)).isEqualTo("2");
assertThat(App.joinNumbersFromRange(1, 5)).isEqualTo("12345");
assertThat(App.joinNumbersFromRange(10, 12)).isEqualTo("101112");
}
}Решение учителя откроется через:
20:00
