Ela*_*ich 204 java debugging pretty-print
我希望Stack<Integer>像Eclipse调试器一样打印一个对象(即[1,2,3...]),但打印它out = "output:" + stack不会返回这个好结果.
为了澄清,我在谈论Java的内置集合,所以我无法覆盖它toString().
如何获得堆栈的可打印版本?
Zac*_*ley 307
您可以将其转换为数组,然后将其打印出来Arrays.toString(Object[]):
System.out.println(Arrays.toString(stack.toArray()));
use*_*765 48
String.join(",", yourIterable);
(Java 8)
bsm*_*smk 17
使用java 8流和收集器,它可以轻松完成:
String format(Collection<?> c) {
  String s = c.stream().map(Object::toString).collect(Collectors.joining(","));
  return String.format("[%s]", s);
}
首先我们使用mapwith Object::toString来创建Collection<String>然后使用join collector来加入集合中的每个项目,作为分隔符.
Chi*_*ery 12
在类上实现toString().
我建议使用Apache Commons ToStringBuilder来简化这一过程.有了它,你只需要编写这种方法:
public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       toString(); 
}
为了获得这种输出:
人@ 7f54 [名称=斯蒂芬,年龄= 29]
还有一个反思性的实施.
小智 11
System.out.println(Collection c)已经以可读格式打印任何类型的集合.仅当集合包含用户定义的对象时,您才需要在用户定义的类中实现toString()以显示内容.
我同意上述有关覆盖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();
    }
}
这不是一个全面的实现,而只是一个启动器.
在 Java8 中
//will prints each element line by line
stack.forEach(System.out::println);
或者
//to print with commas
stack.forEach(
    (ele) -> {
        System.out.print(ele + ",");
    }
);
您可以使用JAVA中的"Objects"类(自1.7起可用)
Collection<String> myCollection = Arrays.asList("1273","123","876","897");
Objects.toString(myCollection);
产出:1273,123,876,897
另一种可能性是使用Google Guave中的"MoreObjects"类,它提供了许多有用的辅助函数:
MoreObjects.toStringHelper(this).add("NameOfYourObject", myCollection).toString());
输出:NameOfYourObject = [1273,123,876,897]
使用Apache Commons 3,您想调用
StringUtils.join(myCollection, ",")