尝试将 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;
}
作为替代方案,您可以将 csq
的 subSequence
传递给 writeLine
。
我正在尝试将一个字符串附加到 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;
}
作为替代方案,您可以将 csq
的 subSequence
传递给 writeLine
。