В группах классов, которые могут содержать фигуры и другие группы, у меня есть метод 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;
}




У вас есть пара подгрупп, каждая из которых содержит несколько фигурок и пару фигурок.
Каждая подгруппа вернет что-то вроде этого для 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
Ой, подождите, в конце не хватает разрыва строки. Позвольте мне исправить ответ.
Попробуйте обновленную версию, пожалуйста
Результат тот же, что и в вопросе, он не работает
Вам следует добавить «\t» в блок else, тогда все работает. Отредактируйте свой ответ, и я отмечу его как решение
Ах да. Спасибо. Сделанный!
На самом деле он ничего не игнорирует. Вы выводите только одну табуляцию в начале всей строки. Но тогда сама строка состоит из нескольких строк, и каждая строка, естественно, снова начинается слева. У него нет способа узнать, что ему следует скопировать вкладку из предыдущей строки. Для этого вам нужна логика программирования.