漂亮地打印Java集合(toString不会返回漂亮的输出)

漂亮地打印Java集合(toString不会返回漂亮的输出),java,debugging,pretty-print,Java,Debugging,Pretty Print,我希望像Eclipse调试器一样漂亮地打印Stack对象(即[1,2,3…]),但使用out=“output:“+Stack打印它不会返回这个好结果 我只是想澄清一下,我说的是Java的内置集合,所以我不能覆盖它的toString() 如何获得一个好的可打印版本的堆栈?您可以将其转换为数组,然后使用数组打印出来。toString(Object[]): 如果这是您自己的集合类而不是内置的集合类,则需要重写其toString方法。Eclipse为其没有硬连线格式的任何对象调用该函数。在类上实现toS

我希望像Eclipse调试器一样漂亮地打印
Stack
对象(即
[1,2,3…]
),但使用
out=“output:“+Stack
打印它不会返回这个好结果

我只是想澄清一下,我说的是Java的内置集合,所以我不能覆盖它的
toString()


如何获得一个好的可打印版本的堆栈?

您可以将其转换为数组,然后使用
数组打印出来。toString(Object[])


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

在类上实现toString()

我建议您使用更简单的方法。使用它,您只需编写这种方法:

public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       toString(); 
}
要获得此类输出,请执行以下操作:

Person@7f54[姓名=斯蒂芬,年龄=29]


还有一个问题。

我同意上面关于在您自己的类上重写
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.
}
编辑:响应XUKXPVFZFLBLD的评论,这里是前面提到的案例的一个可能实现

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

}
package com.so.demos;
导入java.util.List;
导入java.util.Map;
导入java.util.Set;
公共类ToStringHelper{
专用字符串分隔符;
私有字符串箭头;
public-ToString-Helper(字符串分隔符、字符串箭头){
this.separator=分隔符;
这个箭头=箭头;
}
公共字符串toString(列表l){
StringBuilder sb=新的StringBuilder(“”);
字符串sep=“”;
用于(对象:l){
sb.append(sep.append(object.toString());
sep=分离器;
}
返回某人。追加(“)”。toString();
}
公共字符串到字符串(映射m){
StringBuilder sb=新的StringBuilder(“[”);
字符串sep=“”;
对于(对象:m.keySet()){
某人(九月)
.append(object.toString())
.append(箭头)
.append(m.get(object.toString());
sep=分离器;
}
返回sb.append(“]”).toString();
}
公共字符串到字符串(集合s){
StringBuilder sb=新的StringBuilder(“{”);
字符串sep=“”;
用于(对象:s){
sb.append(sep.append(object.toString());
sep=分离器;
}
返回sb.append(“}”).toString();
}
}

这不是一个完整的实现,只是一个开始。

System.out.println(Collection c)已经以可读的格式打印了任何类型的集合。只有当集合包含用户定义的对象时,才需要在用户定义的类中实现toString(),以显示内容。

刚刚修改了前面的示例,以打印包含用户定义对象的集合

public class ToStringHelper {

    private  static String separator = "\n";

    public ToStringHelper(String seperator) {
        super();
        ToStringHelper.separator = seperator;

    }

    public  static String toString(List<?> l) {
        StringBuilder sb = new StringBuilder();
        String sep = "";
        for (Object object : l) {
            String v = ToStringBuilder.reflectionToString(object);
            int start = v.indexOf("[");
            int end = v.indexOf("]");
            String st =  v.substring(start,end+1);
            sb.append(sep).append(st);
            sep = separator;
        }
        return sb.toString();
    }

    public static String toString(Map<?,?> m) {
        StringBuilder sb = new StringBuilder();
        String sep = "";
        for (Object object : m.keySet()) {
            String v = ToStringBuilder.reflectionToString(m.get(object));
            int start = v.indexOf("[");
            int end = v.indexOf("]");
            String st =  v.substring(start,end+1);
            sb.append(sep).append(st);
            sep = separator;
        }
        return sb.toString();
    }

    public static String toString(Set<?> s) {
        StringBuilder sb = new StringBuilder();
        String sep = "";
        for (Object object : s) {
            String v = ToStringBuilder.reflectionToString(object);
            int start = v.indexOf("[");
            int end = v.indexOf("]");
            String st =  v.substring(start,end+1);
            sb.append(sep).append(st);
            sep = separator;
        }
        return sb.toString();
    }

    public static void print(List<?> l) {
        System.out.println(toString(l));    
    }
    public static void print(Map<?,?> m) {
        System.out.println(toString(m));    
    }
    public static void print(Set<?> s) {
        System.out.println(toString(s));    
    }

}
public类到stringhelper{
专用静态字符串分隔符=“\n”;
公用串分离器(串分离器){
超级();
ToStringHelper.分离器=分离器;
}
公共静态字符串toString(列表l){
StringBuilder sb=新的StringBuilder();
字符串sep=“”;
用于(对象:l){
String v=ToStringBuilder.reflectionString(对象);
int start=v.indexOf(“[”);
int end=v.indexOf(“]”);
字符串st=v.子字符串(开始、结束+1);
某人附加(九月)附加(九月);
sep=分离器;
}
使某人返回字符串();
}
公共静态字符串到字符串(映射m){
StringBuilder sb=新的StringBuilder();
字符串sep=“”;
对于(对象:m.keySet()){
String v=ToStringBuilder.reflectionString(m.get(object));
int start=v.indexOf(“[”);
int end=v.indexOf(“]”);
字符串st=v.子字符串(开始、结束+1);
某人附加(九月)附加(九月);
sep=分离器;
}
使某人返回字符串();
}
公共静态字符串到字符串(集合s){
StringBuilder sb=新的StringBuilder();
字符串sep=“”;
用于(对象:s){
String v=ToStringBuilder.reflectionString(对象);
int start=v.indexOf(“[”);
int end=v.indexOf(“]”);
字符串st=v.子字符串(开始、结束+1);
某人附加(九月)附加(九月);
sep=分离器;
}
使某人返回字符串();
}
公共静态无效打印(列表l){
System.out.println(toString(l));
}
公共静态无效打印(地图m){
System.out.println(toString(m));
}
公共静态无效打印(套){
System.out.println(toString(s));
}
}

Apache Commons项目提供的MapUtils类提供了一个
MapUtils.debugPrint
方法,可以很好地打印地图。

在收集时调用Sop时要小心,它可能引发
ConcurrentModification
异常。因为每个集合的内部
toString
方法在集合上内部调用
迭代器。

应该适用于除
Map
之外的任何集合,但它也很容易支持。 如果需要,修改代码以将这3个字符作为参数传递

static <T> String seqToString(Iterable<T> items) {
    StringBuilder sb = new StringBuilder();
    sb.append('[');
    boolean needSeparator = false;
    for (T x : items) {
        if (needSeparator)
            sb.append(' ');
        sb.append(x.toString());
        needSeparator = true;
    }
    sb.append(']');
    return sb.toString();
}
静态字符串seqToString(Iterable项){
StringBuilder sb=新的StringBuilder();
某人附加(“[”);
布尔值=false;
对于(T x:项目){
如果(需要分隔符)
某人附加(“”);
sb.append(x.toString());
needSeparator=true;
}
某人附加(']');
使某人返回字符串();
}

使用java 8流和收集器,它可以
static <T> String seqToString(Iterable<T> items) {
    StringBuilder sb = new StringBuilder();
    sb.append('[');
    boolean needSeparator = false;
    for (T x : items) {
        if (needSeparator)
            sb.append(' ');
        sb.append(x.toString());
        needSeparator = true;
    }
    sb.append(']');
    return sb.toString();
}
String format(Collection<?> c) {
  String s = c.stream().map(Object::toString).collect(Collectors.joining(","));
  return String.format("[%s]", s);
}
String.join(",", yourIterable);
//will prints each element line by line
stack.forEach(System.out::println);
//to print with commas
stack.forEach(
    (ele) -> {
        System.out.print(ele + ",");
    }
);
org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString(yourCollection);
Collection<String> myCollection = Arrays.asList("1273","123","876","897");
Objects.toString(myCollection);
MoreObjects.toStringHelper(this).add("NameOfYourObject", myCollection).toString());
StringUtils.join(myCollection, ",")
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

public class ToString {
  static class Foo {
    int i;
    public Foo(int i) { this.i=i; }
    @Override
    public String toString() {
        return "{ i: " + i + " }";
    }
  }
  public static void main(String[] args) {
    List<Foo> foo = new ArrayList<>();
    foo.add(new Foo(10));
    foo.add(new Foo(12));
    foo.add(new Foo(13));
    foo.add(new Foo(14));
    System.out.println(foo.toString());
    // prints: [{ i: 10 }, { i: 12 }, { i: 13 }, { i: 14 }]

    Map<Integer, Foo> foo2 = new HashMap<>();
    foo2.put(10, new Foo(10));
    foo2.put(12, new Foo(12));
    foo2.put(13, new Foo(13));
    foo2.put(14, new Foo(14));
    System.out.println(foo2.toString());
    // prints: {10={ i: 10 }, 12={ i: 12 }, 13={ i: 13 }, 14={ i: 14 }}
  }
}
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

public class ToString {
  static record Foo(int i) { }
  
  public static void main(String[] args) {
    Foo f = new Foo(10);
    System.out.println(f.toString());
    // prints: Foo[i=10]

    List<Foo> foo = new ArrayList<>();
    foo.add(new Foo(10));
    foo.add(new Foo(12));
    foo.add(new Foo(13));
    foo.add(new Foo(14));
    System.out.println(foo.toString());
    // prints: [Foo[i=10], Foo[i=12], Foo[i=13], Foo[i=14]]

    Map<Integer, Foo> foo2 = new HashMap<>();
    foo2.put(10, new Foo(10));
    foo2.put(12, new Foo(12));
    foo2.put(13, new Foo(13));
    foo2.put(14, new Foo(14));
    System.out.println(foo2.toString());
    // prints: {10=Foo[i=10], 12=Foo[i=12], 13=Foo[i=13], 14=Foo[i=14]}
  }
}
@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(","));
   }
    public abstract class AbstractCollection<E> implements Collection<E> {
    ...
    public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";
    
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }