有没有办法在String(StringBuilder)的每一行的开头添加一个char或tab?

时间:2014-01-02 17:38:51

标签: java

我需要打印一个对象,这个对象里面包含其他对象。所需的输出是多级打印,如下所示:

[
    [
      [ 
      ]
    ]
]

我可以从内部类中更改toString方法,但我想避免这种情况,并且只考虑我班级中的toString方法。

有什么想法?

解决方案:

`     public String toString(){

    StringBuilder usina = new StringBuilder();

    usina.append("Usina: [\n\t");

    for (Turbina turbina : turbinas)
        usina.append(turbina.toString().replace("\n", "\n\t"));

    usina.append(populacao.toString().replace("\n", "\n\t"));

    usina.append("]\n").deleteCharAt(usina.lastIndexOf("\t"));
    return usina.toString();

}

`

4 个答案:

答案 0 :(得分:3)

也许你应该像这样覆盖toString

public String toString() {
  return toStringWithPrefix("")
}

然后递归地委托toStringWithPrefix(..)方法中的嵌套对象,如下所示

String toStringWithPrefix(String prefix) {
  String result = "["
  for(AnObject obj : internalObjects) {
     result += obj.toStringWithPrefix(prefix + "\t") + ",\n";
  }
  return result + "]"
}

如果您想构建较大对象图的字符串表示,则可以使用StringBuilderStringBuffer。在这种情况下,您可能会考虑使用堆栈和while循环替换递归,以避免堆栈溢出。

答案 1 :(得分:1)

如果您不介意使用外部库,可以使用json库轻松获取对象的漂亮打印JSON字符串。

例如Gson:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(yourObject);

如果您打算覆盖toString(),则可以使用\t标签和\n进行换行。

答案 2 :(得分:0)

假设您要打印的课程类似于以下内容:

class A
{
    int primitive;
    Object object;
    Object[] array;
    // ...
}

2个想法:

  1. 覆盖toString()中的A\n是一个新行(您可以使用System.getProperty("line.separator")获取新行字符),\t是制表符。

    @Override
    public String toString()
    {
        final StringBuilder sb = new StringBuilder("[\n");
        sb.append('\t\n');
        sb.append(primitive);
        sb.append('\t\n');
        sb.append(object.toString());
        sb.append('\t\n');
        sb.append(Arrays.toString(array));
        // ... 
        sb.append(']');     
        return sb.toString();
    }
    

    它假定object也提供了正确的toString()实施。

  2. 和之前一样,但是使用reflection来获取所有成员而不是硬编码。

答案 3 :(得分:0)

最终结果:

` @覆盖     public String toString(){

    StringBuilder outter = new StringBuilder();

    Pattern pattern = Pattern.compile("(?m)(^)"); //Line begin: multiline mode
            Matcher matcher = pattern.matcher(inners.toString());

    outter.append("[\n");

    outter.append(matcher.replaceAll("\t"));

    outter.append("]\n");


    return outter.toString();

}

` http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#MULTILINE