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

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()));
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢.简单,干净.说实话,集合也需要一个toString方法,但这也有效. (11认同)
  • `stack.toArray()` 可能非常昂贵,包括 CPU、时间和内存。迭代原始集合/可迭代的解决方案可能会消耗更少的资源。 (2认同)

use*_*765 48

String.join(",", yourIterable);
Run Code Online (Sandbox Code Playgroud)

(Java 8)

  • yourIterable必须是Iterable <?扩展CharSequence> (9认同)
  • String.join(",",yourCollection.stream().map(o - > o.toString()).collect(Collectors.toList())) (2认同)
  • @user1016765 `yourCollection.stream().map( o -&gt; o.toString() ).collect( join(",") ))` 更好,因为你从左到右阅读它,你不需要看回到前面,在你的大脑中计算中间列表做了什么 (2认同)

tla*_*rea 18

Apache Commons项目提供的MapUtils类提供了MapUtils.debugPrint一种可以打印地图的方法.

  • 番石榴有类似的东西吗? (2认同)

bsm*_*smk 17

使用java 8流和收集器,它可以轻松完成:

String format(Collection<?> c) {
  String s = c.stream().map(Object::toString).collect(Collectors.joining(","));
  return String.format("[%s]", s);
}
Run Code Online (Sandbox Code Playgroud)

首先我们使用mapwith Object::toString来创建Collection<String>然后使用join collector来加入集合中的每个项目,作为分隔符.

  • 我不得不忍住不要从答案中删除"容易"这个词;-)`Collections.toString(stack)`会很容易. (21认同)
  • 是的,该格式已指定。 (2认同)

Chi*_*ery 12

在类上实现toString().

我建议使用Apache Commons ToStringBuilder简化这一过程.有了它,你只需要编写这种方法:

public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       toString(); 
}
Run Code Online (Sandbox Code Playgroud)

为了获得这种输出:

人@ 7f54 [名称=斯蒂芬,年龄= 29]

还有一个反思性的实施.

  • 使用反射ToStringBuilder,HashCodeBuilder和EqualsBuilder是非常无效的.虽然输出还可以,但这些课程几乎不是本周的表现高峰...... (2认同)
  • 问题明确说明该类是内置集合,因此无法修改toString(). (2认同)

小智 11

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


小智 11

番石榴看起来是个不错的选择:

Iterables.toString(myIterable)


joe*_*ely 9

我同意上述有关覆盖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.
}
Run Code Online (Sandbox Code Playgroud)

编辑:回应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();
    }

}
Run Code Online (Sandbox Code Playgroud)

这不是一个全面的实现,而只是一个启动器.


YÒG*_*ÒGÎ 6

在 Java8 中

//will prints each element line by line
stack.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

或者

//to print with commas
stack.forEach(
    (ele) -> {
        System.out.print(ele + ",");
    }
);
Run Code Online (Sandbox Code Playgroud)


Chi*_*y88 6

您可以使用JAVA中"Objects"类(自1.7起可用)

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

产出:1273,123,876,897

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

MoreObjects.toStringHelper(this).add("NameOfYourObject", myCollection).toString());
Run Code Online (Sandbox Code Playgroud)

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

番石榴文件


JRA*_*TLL 5

使用Apache Commons 3,您想调用

StringUtils.join(myCollection, ",")
Run Code Online (Sandbox Code Playgroud)