[英]Add new line to bottom of StringJoiner
我有以下方法
public String toIndentedString() {
StringJoiner sj = new StringJoiner("\n");
sj.add(rootValue.toString());
for (Tree<T> child : children) {
String childString = child.toIndentedString();
sj.add(childString.replaceAll("(?m)^", " "));
}
return sj.toString();
}
它返回的输出略微关闭,这是一张显示其所需输出的图像。
有人可以告诉我要使它生效需要进行哪些更改?
StringJoiner的想法是,您可以使用构造函数来指定参数
定界符-每个元素之间要使用的字符序列
添加到StringJoiner前缀-要包含的字符序列
在后缀开头使用-在结尾使用的字符序列
所以你可以做
StringJoiner sj = new StringJoiner("\n", "", "\n");
一种解决方案是用换行符包装每个值,然后删除父级中多余的值:
public String toIndentedString() {
return "\n" + rootValue + children.stream()
.map(Tree::toIndentedString)
.map(s -> s.substring(0, s.length() - 1)) // strip trailing newline
.map(s -> s.replaceAll("\n", "\n "))
.collect(Collectors.joining())
+ "\n";
}
另外,您可以将缩进逻辑与行插入分开,如下所示:
public String toIndentedString() {
return indentChildren()
.collect(Collectors.joining("\n", "\n", "\n"));
}
private Stream<String> indentChildren() {
return Stream.concat(Stream.of(rootValue.toString()),
children.stream()
.flatMap(Tree::indentChildren)
.map(" "::concat));
}
这是解决方案,我需要将StringJoiner放入另一个方法中。 然后调用该方法并添加新行“ \\ n”。 代码也已更改为使用StringBuilder,因为它更简单。 特别感谢4castle为我提供的帮助!
public String toIndentedString() {
return _toIndentedString() + '\n';
}
private String _toIndentedString() {
StringBuilder sb = new StringBuilder(rootValue.toString());
for (Tree<T> child : children) {
sb.append('\n');
sb.append(child._toIndentedString().replaceAll("(?m)^", " "));
}
return sb.toString();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.