Java 有没有办法在字符串的每行开头添加字符或制表符(StringBuilder)?

Java 有没有办法在字符串的每行开头添加字符或制表符(StringBuilder)?,java,Java,我需要打印一个对象,这个对象包含其他对象。所需输出是如下所示的多级打印: [ [ [ ] ] ] 我可以从内部类更改toString方法,但我希望避免这种情况,只考虑类中的toString方法 有什么想法吗 解决方案: ` 公共字符串toString(){ `如果您不介意使用外部库,您可以使用json库轻松获得打印精美的对象json字符串 例如,对于Gson: Gson gson = new GsonBuilder().setPrettyPrintin

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

[
    [
      [ 
      ]
    ]
]
我可以从内部类更改toString方法,但我希望避免这种情况,只考虑类中的toString方法

有什么想法吗

解决方案:

` 公共字符串toString(){


`

如果您不介意使用外部库,您可以使用json库轻松获得打印精美的对象json字符串

例如,对于Gson:

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

如果您计划覆盖
toString()
,您可以使用
\t
作为制表符,使用
\n
作为换行符。

如果您不介意使用外部库,您可以使用json库轻松获得打印精美的对象json字符串

例如,对于Gson:

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

如果您计划覆盖
toString()
,您可以对制表符使用
\t
,对换行符使用
\n

也许您应该像这样覆盖
toString

public String toString() {
  return toStringWithPrefix("")
}
String toStringWithPrefix(String prefix) {
  String result = "["
  for(AnObject obj : internalObjects) {
     result += obj.toStringWithPrefix(prefix + "\t") + ",\n";
  }
  return result + "]"
}
然后递归地委托给
toStringWithPrefix(..)
方法中的嵌套对象,如下所示

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

< p >您可以使用<代码> StringBuilder <代码>或<代码> StringBuffer <代码>,如果您想构建更大的对象图的字符串表示形式。在这种情况下,您可以考虑用堆栈和while循环替换递归,以避免堆栈溢出。

也许您应该重写<代码> toString ,像这个

public String toString() {
  return toStringWithPrefix("")
}
String toStringWithPrefix(String prefix) {
  String result = "["
  for(AnObject obj : internalObjects) {
     result += obj.toStringWithPrefix(prefix + "\t") + ",\n";
  }
  return result + "]"
}
然后递归地委托给
toStringWithPrefix(..)
方法中的嵌套对象,如下所示

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

< P > >您可以使用<代码> StringBuilder <代码>或<代码> StringBuffer <代码>,如果您想构建更大对象图的字符串表示形式。在这种情况下,您可以考虑用堆栈和while循环替换递归,以避免堆栈溢出。

假设您要打印的类与此类似:

class A
{
    int primitive;
    Object object;
    Object[] array;
    // ...
}
2个想法:

  • A
    \n
    中的Override
    toString()
    是一个新行(可以使用
    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()
    实现

  • 像以前一样,但是使用获取所有成员,而不是硬编码


  • 假设要打印的类与此类似:

    class A
    {
        int primitive;
        Object object;
        Object[] array;
        // ...
    }
    
    2个想法:

  • A
    \n
    中的Override
    toString()
    是一个新行(可以使用
    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()
    实现

  • 像以前一样,但是使用获取所有成员,而不是硬编码

  • 最终结果:

    ` @凌驾 公共字符串toString(){

    ` 最终结果:

    ` @凌驾 公共字符串toString(){

    `

    @Pshemo谢谢你的编辑,我只是想知道怎么做。@Pshemo谢谢你的编辑,我只是想知道怎么做。谢谢,但我需要避免在这里添加库或类。这就是为什么我认为StringBuilder可以解决这个问题。也许是正则表达式-尽管如此,我有以前从未在Java中使用过。非常简单…谢谢…尽管有必要进行一些查找和删除,但这解决了我的问题。我用replace()替换了=)哈哈哈谢谢,但是我需要避免在这里添加库或类。这就是为什么我认为StringBuilder可以解决这个问题。可能是正则表达式-虽然,我以前从未在Java中使用过。非常简单…谢谢…虽然需要一些查找和删除,但这解决了我的问题。我用repl替换了它ace()=)哈哈哈谢谢,但是这里的问题是对象也有很多新行,所以我不能使用append。谢谢,但是这里的问题是对象也有很多新行,所以我不能使用append。谢谢,我考虑过了,但是我希望尽可能少地接触。这会起作用……但是上面的解决方案似乎更需要什么essary(对类的影响较小,并且没有添加方法-这是我被要求做的事情)。无论如何,谢谢。对类的公共接口的影响最小,因为它没有添加任何可见的方法。嗨,我同意了(很抱歉回答晚了),但涉及到一个巨大的类链,其中一些类我们无法访问。如果只是三到四个级别…那么我们欺骗了他们,只更改了最后一个类,并用replace()替换正则表达式或者replaceAll-in-Matcher是最好的解决方案。谢谢,我考虑过了,但我希望尽可能少地接触。这会起作用……但是上面的解决方案似乎更必要(对类的影响更小,没有添加方法-这是我被要求做的)。无论如何,谢谢。在不添加任何可见方法的意义上,对类的公共接口的影响是最小的。嗨,我同意了(很抱歉回答得太晚),但这涉及到一个巨大的类链,其中一些类我们无法访问。如果只有三到四个级别…那么我们就欺骗自己只更改最后一个类,使用replace()或replaceAll in Matcher的正则表达式是最好的解决方案。inners还有几个级别。inners还有几个级别。