Вложенная табуляция в Java

В группах классов, которые могут содержать фигуры и другие группы, у меня есть метод toString.

public String toString() {
        StringBuilder str = new StringBuilder("Group consists of:\n");
        for (BaseFigure figure : this.group) {
            str.append("\t").append(figure.toString()).append("\n");
        }
        return str.toString();
    }

Вызывая этот метод, я хочу увидеть нестабильное текстовое отображение таких вложенных групп.

Group consists of:
    Group consists of:
        Rectangle with center at (20.0, 10.0), and width: 15.0, height: 15.0, angle: 45.0
        Rectangle with center at (0.0, 0.0), and width: 7.0, height: 19.0, angle: 90.0
    Group consists of:
        Circle with center at (100.0, 100.0) and radius: 1.0
        Circle with center at (5.0, 0.0) and radius: 9.0

    Rectangle with center at (10.0, 10.0), and width: 10.0, height: 40.0, angle: 0.0
    Circle with center at (0.0, 0.0) and radius: 55.0

Но 4-я строка каким-то образом игнорирует несколько знаков \t и помещает в каждой строке только один \t и отображается следующим образом:

Group consists of:
    Group consists of:
    Rectangle with center at (10.0, 10.0), and width: 10.0, height: 15.0, angle: 0.0
    Rectangle with center at (20.0, 10.0), and width: 15.0, height: 15.0, angle: 45.0
    Rectangle with center at (0.0, 0.0), and width: 7.0, height: 19.0, angle: 90.0
    Group consists of:
    Circle with center at (0.0, 0.0) and radius: 10.0
    Circle with center at (100.0, 100.0) and radius: 1.0
    Circle with center at (5.0, 0.0) and radius: 9.0

Я пробовал заменить каждый \t на двойной \t, но это не сработало.

public String toString() {
        String str = "Group consists of:\n";
        for (BaseFigure figure : this.group) {
            if (figure instanceof Group) {
                String newStr = figure.toString();
                str += newStr.replace("\t", "\t\t");
            } else {
                str += figure.toString();
            }
        }
        return str;
    }

На самом деле он ничего не игнорирует. Вы выводите только одну табуляцию в начале всей строки. Но тогда сама строка состоит из нескольких строк, и каждая строка, естественно, снова начинается слева. У него нет способа узнать, что ему следует скопировать вкладку из предыдущей строки. Для этого вам нужна логика программирования.

RealSkeptic 04.10.2023 18:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть пара подгрупп, каждая из которых содержит несколько фигурок и пару фигурок.

Каждая подгруппа вернет что-то вроде этого для toString():

Group X
    Figure Y
    Figure Z

Или можно сказать, что это Group X\n\tFigure Y\n\tFigure Z\n.

Ваш код делает это StringBuilder str = new StringBuilder("Group consists of:\n"); и str.append("\t").append(figure.toString()).append("\n"), где figure.toString() возвращает строку выше.

В итоге у вас получится: Group consists of:\n\t<whatever toString() for subgroup returned>\n.

Учитывая, что toString() имеет значение Group X\n\tFigure Y\n\tFigure Z\n, как упоминалось выше, мы получаем следующее: Group consists of:\n\tGroup X\n\tFigure Y\n\tFigure Z\n\n. Как видите, в результате перед цифрами в подгруппе всегда остается только одна табуляция. Потому что внутри строки, созданной toString(), есть разрывы строк, и мы не можем контролировать, что там находится в начале строки.

Итак, в конечном итоге это выглядит так:

Group consists of:
    Group X
    Figure Y
    Figure Z

Так как же нам добиться этого?

Group consists of:
    Group X
        Figure Y
        Figure Z

Одним из хакерских способов было бы заменить каждый разрыв строки внутри строки, возвращаемой toString(), разрывом строки, за которым следует табуляция. Это будет работать с вложением, поскольку родительская группа сделает то же самое и, таким образом, добавит еще одну вкладку.

Вы пробовали нечто подобное, но хотели заменить вкладку двумя вкладками. Это в некоторой степени неправильно, потому что в начале каждой строки не обязательно будет табуляция во всем, что создает toString(), и вы забыли добавить собственную табуляцию.

Вместо этого попробуйте это:

public String toString() {
        String str = "Group consists of:\n";
        for (BaseFigure figure : this.group) {
            if (figure instanceof Group) {
                String newStr = figure.toString();
                str += "\t" + newStr.replace("\n", "\n\t") + "\n";
            } else {
                str += "\t" + figure.toString() + "\n";
            }
        }
        return str;
    }

Это не работает. Он возвращает следующий ibb.co/sQ9mcf6

Fischer Benkovscki 04.10.2023 19:51

Ой, подождите, в конце не хватает разрыва строки. Позвольте мне исправить ответ.

mvmn 04.10.2023 20:24

Попробуйте обновленную версию, пожалуйста

mvmn 04.10.2023 21:19

Результат тот же, что и в вопросе, он не работает

Fischer Benkovscki 05.10.2023 10:15

Вам следует добавить «\t» в блок else, тогда все работает. Отредактируйте свой ответ, и я отмечу его как решение

Fischer Benkovscki 05.10.2023 10:24

Ах да. Спасибо. Сделанный!

mvmn 05.10.2023 18:18

Другие вопросы по теме