Есть задача. Метод принимает строку (длинную) и должен распечатать ее построчно так, чтобы длина каждой выводимой строки была не больше 13 символов и слова не разбивались (перенос только на пробелах). Сделал через циклы, но как то очень монструозно, вот чувствую, что можно использовать рекурсию, но не могу понять как.
Пример Ввод
Four score and seven years ago our fathers brought forth upon this continent a new nation,conceived in liberty and dedicated to the proposition that all men are created equal
Вывод
Four score
and seven
years ago
our fathers
brought
forth upon
this
continent a
new nation,
conceived in
liberty and
dedicated to
the
proposition
that all men
are created
equal
Вот возможное решение на рекурсии:
public static void main(String[] args) {
final String source = "Four score and seven years ago our fathers brought forth upon this continent a new nation";
print(13, source.split("\\s"), 0);
}
static void print(final int length, final String[] tokens, int start) {
final StringBuilder line = new StringBuilder();
while (start < tokens.length) {
final String token = tokens[start];
if (line.length() == 0 || line.length() + 1 + token.length() < length) {
start++;
if (line.length() > 0) {
line.append(' ');
}
line.append(token);
} else {
break;
}
}
System.out.println(line.toString());
if (start < tokens.length) {
print(length, tokens, start);
}
}
Но, если у вас есть возможность использовать сторонние библиотеки, то советую взять WordUtils#wrap:
public static void main(String[] args) {
final String source = "Four score and seven years ago our fathers brought forth upon this continent a new nation";
System.out.println(WordUtils.wrap(source, 13 - 1));
}
намного короче и проще. Хочу заметить, что в реализации WordUtils#wrap используются циклы, а не рекурсия, и эта реализация достаточно "монструозна".
Сборка персонального компьютера от Artline: умный выбор для современных пользователей