我希望打印一个Stack<Integer>对象,就像Eclipse调试器做的那样(即[1,2,3…]),但打印它与out = "output:" + Stack不会返回这个好结果。

澄清一下,我说的是Java的内置集合,所以我不能重写它的toString()。

我怎样才能得到一个漂亮的可打印版本的堆栈?


当前回答

在Collection上调用Sop时要小心,它会抛出ConcurrentModification Exception。因为每个集合的内部toString方法在内部调用集合上的迭代器。

其他回答

你可以使用JAVA中的“Objects”类(从1.7开始就有了)

Collection<String> myCollection = Arrays.asList("1273","123","876","897");
Objects.toString(myCollection);

输出:1273,123,876,897

另一种可能是使用谷歌Guave中的"MoreObjects"类,它提供了许多有用的帮助函数:

MoreObjects.toStringHelper(this).add("NameOfYourObject", myCollection).toString());

输出: yourobject =[1273, 123,876, 897]

番石榴文档

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);
}

在类上实现toString()。

我推荐使用Apache Commons ToStringBuilder来简化这个过程。使用它,你只需要写这样的方法:

public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       toString(); 
}

为了得到这样的输出:

Person@7f54 [name =斯蒂芬,age = 29]

还有一个反射实现。

如果这是您自己的集合类,而不是内置的集合类,则需要重写其toString方法。Eclipse对没有固定格式的任何对象调用该函数。

对于Apache Commons 3,您希望调用

StringUtils.join(myCollection, ",")