繁体   English   中英

在StringJoiner的底部添加新行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM