Хорошая печать коллекций Java (toString не возвращает симпатичный вывод) - PullRequest
195 голосов
/ 27 декабря 2008

Я хочу напечатать объект Stack<Integer> так же хорошо, как это делает отладчик Eclipse (т. Е. [1,2,3...]), но печать его с помощью out = "output:" + stack не возвращает этот хороший результат.

Просто чтобы уточнить, я говорю о встроенной коллекции Java, поэтому я не могу переопределить ее toString().

Как мне получить хорошую версию стека для печати?

Ответы [ 17 ]

2 голосов
/ 01 августа 2015

В Java8

//will prints each element line by line
stack.forEach(System.out::println);

или

//to print with commas
stack.forEach(
    (ele)->{
               System.out.print(ele+",");
           }
);
1 голос
/ 08 сентября 2010

Только что модифицировал предыдущий пример для печати четной коллекции, содержащей определенные пользователем объекты.

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

}
1 голос
/ 17 августа 2018

большинство коллекций имеют полезную toString() в Java в эти дни (Java7 / 8). Поэтому нет необходимости выполнять потоковые операции для объединения того, что вам нужно, просто переопределите toString вашего класса значений в коллекции, и вы получите то, что вам нужно.

и AbstractMap и AbstractCollection реализуют toString (), вызывая toString для элемента.

ниже - это тестовый класс для демонстрации поведения.

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 }}
  }
}
0 голосов
/ 30 марта 2014

Должно работать для любой коллекции, кроме 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();
}
0 голосов
/ 28 декабря 2008

Если это ваш собственный класс коллекции, а не встроенный, вам необходимо переопределить его метод toString. Eclipse вызывает эту функцию для любых объектов, для которых она не имеет аппаратного форматирования.

0 голосов
/ 19 августа 2012

Будьте внимательны при вызове Sop на Collection, он может выдать ConcurrentModification Exception. Поскольку внутренне toString метод каждой Коллекции внутренне вызывает Iterator поверх Коллекции.

0 голосов
/ 12 сентября 2015

Вы можете попробовать использовать

org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString(yourCollection);
...