我希望打印一个Stack<Integer>对象,就像Eclipse调试器做的那样(即[1,2,3…]),但打印它与out = "output:" + Stack不会返回这个好结果。
澄清一下,我说的是Java的内置集合,所以我不能重写它的toString()。
我怎样才能得到一个漂亮的可打印版本的堆栈?
我希望打印一个Stack<Integer>对象,就像Eclipse调试器做的那样(即[1,2,3…]),但打印它与out = "output:" + Stack不会返回这个好结果。
澄清一下,我说的是Java的内置集合,所以我不能重写它的toString()。
我怎样才能得到一个漂亮的可打印版本的堆栈?
当前回答
如果这是您自己的集合类,而不是内置的集合类,则需要重写其toString方法。Eclipse对没有固定格式的任何对象调用该函数。
其他回答
在Collection上调用Sop时要小心,它会抛出ConcurrentModification Exception。因为每个集合的内部toString方法在内部调用集合上的迭代器。
有两种方法可以简化工作。 1. 导入Gson库。 2. 使用Lombok。
它们都可以帮助您从对象实例创建String。Gson将解析你的对象,lombok将覆盖你的类对象toString方法。
我放了一个关于Gson prettyPrint的例子,我创建了一个helper类来打印对象和对象的集合。如果使用lombok,可以将类标记为@ToString并直接打印对象。
@Scope(value = "prototype")
@Component
public class DebugPrint<T> {
public String PrettyPrint(T obj){
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return gson.toJson(obj);
}
public String PrettyPrint(Collection<T> list){
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return list.stream().map(gson::toJson).collect(Collectors.joining(","));
}
}
我同意上面关于在您自己的类上重写toString()的评论(以及关于尽可能自动化该过程)。
对于你没有定义的类,你可以为你想要处理的每个库类编写一个重载方法的ToStringHelper类:
public class ToStringHelper {
//... instance configuration here (e.g. punctuation, etc.)
public toString(List m) {
// presentation of List content to your liking
}
public toString(Map m) {
// presentation of Map content to your liking
}
public toString(Set m) {
// presentation of Set content to your liking
}
//... etc.
}
编辑:针对xukxpvfzflbbld的评论,下面是针对前面提到的情况的可能实现。
package com.so.demos;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ToStringHelper {
private String separator;
private String arrow;
public ToStringHelper(String separator, String arrow) {
this.separator = separator;
this.arrow = arrow;
}
public String toString(List<?> l) {
StringBuilder sb = new StringBuilder("(");
String sep = "";
for (Object object : l) {
sb.append(sep).append(object.toString());
sep = separator;
}
return sb.append(")").toString();
}
public String toString(Map<?,?> m) {
StringBuilder sb = new StringBuilder("[");
String sep = "";
for (Object object : m.keySet()) {
sb.append(sep)
.append(object.toString())
.append(arrow)
.append(m.get(object).toString());
sep = separator;
}
return sb.append("]").toString();
}
public String toString(Set<?> s) {
StringBuilder sb = new StringBuilder("{");
String sep = "";
for (Object object : s) {
sb.append(sep).append(object.toString());
sep = separator;
}
return sb.append("}").toString();
}
}
这不是一个成熟的实现,而只是一个开始。
如果这是您自己的集合类,而不是内置的集合类,则需要重写其toString方法。Eclipse对没有固定格式的任何对象调用该函数。
JSON
另一种解决方案是将您的集合转换为JSON格式并打印JSON - string。其优点是格式良好且可读的Object-String,而不需要实现toString()。
使用谷歌的Gson的示例:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
...
printJsonString(stack);
...
public static void printJsonString(Object o) {
GsonBuilder gsonBuilder = new GsonBuilder();
/*
* Some options for GsonBuilder like setting dateformat or pretty printing
*/
Gson gson = gsonBuilder.create();
String json= gson.toJson(o);
System.out.println(json);
}