尝试将 String 附加到 Custom StringBuilder 时出现重复且不正确的结果

Duplicate and incorrect result trying to append String to Custom StringBuilder

我正在尝试将一个字符串附加到 StringBuilder 我有代码设置。

这是我输入的

this = "is"\na = "test"

这是我得到的输出

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

我的预期输出是

    this = "is"
    a = "test"

这是我正在执行的代码。我有一个 class implements 以下 classes 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();

我在这里做错了什么?我将如何解决这个问题以获得正确的输入结果?

您始终将整个输入 CharSequence 传递给 writeLine,并且 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;
}

作为替代方案,您可以将 csqsubSequence 传递给 writeLine