Реализовать форматирование текста в консоли

12. Вывести текст в консоли в виде рамки

Условие задачи:
Необходимо реализовать метод printFormattedText(String text), который:

  • разбивает переданную строку на отдельные слова;

  • выводит каждое слово на новой строке;

  • выравнивает строки по длине самого длинного слова;

  • обрамляет результат символами *.

Код:

public class Task1 {
    private static final String TEXT = "I am Java Developer";

    public void printFormattedText(String text) {
        throw new UnsupportedOperationException("Implemented it!");
    }
}

Для строки:

I am Java Developer

ожидаемый вывод:

****************
*  I            *
*  am           *
*  Java         *
*  Developer    *
****************

Спойлеры к решению

Подсказки
💡 Разбей строку на слова через split("\\s+").
💡 Сначала найди длину самого длинного слова.
💡 Верхняя и нижняя границы должны иметь такую же ширину, как строки с текстом.
💡 Для выравнивания слов удобно использовать printf() с форматом %-Ns.

Решение
public class Task1 {

    private static final String TEXT = "I am Java Developer";

    public void printFormattedText(String text) {
        if (text == null || text.trim().isEmpty()) {
            return;
        }

        String[] words = text.trim().split("\\s+");

        int maxLength = 0;

        for (String word : words) {
            maxLength = Math.max(maxLength, word.length());
        }

        String border = "*".repeat(maxLength + 7);

        System.out.println(border);

        for (String word : words) {
            System.out.printf(
                    "*  %-" + maxLength + "s   *%n",
                    word
            );
        }

        System.out.println(border);
    }

    public static void main(String[] args) {
        Task1 task = new Task1();
        task.printFormattedText(TEXT);
    }
}

Сначала строка разбивается на слова:

String[] words = text.trim().split("\\s+");

Затем определяется длина самого длинного слова:

for (String word : words) {
    maxLength = Math.max(maxLength, word.length());
}

Для примера самым длинным является:

Developer

его длина — 9.

Строка внутри рамки имеет структуру:

* + 2 пробела + слово + выравнивание + 3 пробела + *

поэтому ширина границы равна:

maxLength + 7

Формат:

"*  %-" + maxLength + "s   *%n"

выравнивает каждое слово по левому краю до ширины самого длинного слова.

Результат:

****************
*  I            *
*  am           *
*  Java         *
*  Developer    *
****************

Временная сложность — O(n), где n — количество символов в исходной строке.