我需要打印一个对象,这个对象里面包含其他对象。所需的输出是多级打印,如下所示:
[
[
[
]
]
]
我可以从内部类中更改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();
}
`
答案 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 + "]"
}
如果您想构建较大对象图的字符串表示,则可以使用StringBuilder
或StringBuffer
。在这种情况下,您可能会考虑使用堆栈和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个想法:
覆盖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()
实施。
和之前一样,但是使用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