Повторяющийся и неверный результат при попытке добавить строку в пользовательский StringBuilder - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь добавить строку в StringBuilder. У меня настроен код.

Это то, что я ввожу

this = "is"\na = "test"

Это вывод, который я получаю

    this = "is"
    this = "is"
a = "test"

мой ожидаемый результат -

    this = "is"
    a = "test"

Вот мой код, который выполняет эту работу. У меня есть класс, который implements следующие классы CharSequence, Appendable, Serializable

и затем я переопределяю добавление, используя код ниже

@Override
public IndentingStringBuilder append(CharSequence csq) {
    append(csq, 0, csq.length());
    return this;
}

@Override
public IndentingStringBuilder append(CharSequence csq, int start, int end) {
    while (start < end) {
        if (csq.charAt(start) == '\n') {
            writeLine(csq.toString(), start);
            stringBuilder.append(newLine);
            beginningOfLine = true;
            start++;
        } else {
            start++;
        }
    }
    writeLine(csq.toString(), start);
    return this;
}

private void writeLine(String str, int end) {
    if (beginningOfLine && end > 0) {
        writeIndent();
        beginningOfLine = false;
    }
    stringBuilder.append(str, 0, end);
}

private void writeIndent() {
    for (int i = 0; i < indentLevel; i++) {
        stringBuilder.append(' ');
    }
}

это глобальные переменные, определенные

private static final String newLine = System.getProperty("line.separator");
private int indentLevel = 0;
private StringBuilder stringBuilder = new StringBuilder();

Что я здесь не так делаю? и как бы я исправить это, чтобы получить правильные результаты для моего ввода?

1 Ответ

0 голосов
/ 05 ноября 2018

Вы всегда передаете writeLine весь ввод CharSequence, а writeLine всегда добавляет символы ввода String, начиная с первого символа.

Следовательно, первый вызов writeLine добавляет

    this = "is"

и добавляется второй вызов

    this = "is"
a = "test"

Вы можете передать другой аргумент writeLine:

private void writeLine(String str, int from, int to) {
    if (beginningOfLine && to > 0) {
        writeIndent();
        beginningOfLine = false;
    }
    stringBuilder.append(str, from, to);
}

и позвоните из append следующим образом:

public IndentingStringBuilder append(CharSequence csq, int start, int end) {
    int from = 0;
    while (start < end) {
        if (csq.charAt(start) == '\n') {
            writeLine(csq.toString(), from, start);
            from = start + 1;
            stringBuilder.append(newLine);
            beginningOfLine = true;
            start++;
        } else {
            start++;
        }
    }
    writeLine(csq.toString(), from, start);
    return this;
}

В качестве альтернативы вы можете перейти к writeLine a subSequence из csq.

...