当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《很好地打印Java集合(toString不会返回漂亮的输出)》经验,为你挑选了9个好方法。

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

为了澄清,我在谈论Java的内置集合,所以我无法覆盖它toString().

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



1> Zach Langley..:

您可以将其转换为数组,然后将其打印出来Arrays.toString(Object[]):

System.out.println(Arrays.toString(stack.toArray()));


我喜欢.简单,干净.说实话,集合也需要一个toString方法,但这也有效.

2> user1016765..:
String.join(",", yourIterable);

(Java 8)


yourIterable必须是Iterable <?扩展CharSequence>
String.join(",",yourCollection.stream().map(o - > o.toString()).collect(Collectors.toList()))

3> tlavarea..:

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


番石榴有类似的东西吗?

4> bsmk..:

使用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然后使用join collector来加入集合中的每个项目,作为分隔符.


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

5> Chinnery..:

在类上实现toString().

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

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

为了获得这种输出:

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

还有一个反思性的实施.


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

6> 小智..:

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



7> 小智..:

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

Iterables.toString(myIterable)



8> joel.neely..:

我同意上述有关覆盖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();
    }

}

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



9> Chisey88..:

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

Collection 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]

番石榴文件

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有