Многострочная красивая печать (вложенных) коллекций в Java

Я хочу иметь возможность (красиво) печатать содержимое своих карт.

Они должны иметь новые строки и отступы, а не одну строку; игнорирование методов toString коллекций/итераций/и т. д.; и рекурсия во вложенные коллекции.

Это особенно интересно для меня в отношении карт. Я полагаю, что JSON может быть уместным, но я не хочу заходить так далеко, или, по крайней мере, я не хочу, чтобы мой код знал о JSON только для того, чтобы я мог его красиво напечатать. Каковы мои варианты (кроме написания этого самостоятельно)?


person einpoklum    schedule 02.03.2013    source источник


Ответы (4)


Вы можете использовать метод MapUtils.debugPrint из коллекций Apache Commons для печати вложенных карт.

Этот метод печатает хорошо отформатированную строку, описывающую карту. Каждая запись карты будет напечатана с ключом, значением и именем класса значения. Когда значение представляет собой Map, происходит рекурсивное поведение.

person lbalazscs    schedule 03.03.2013
comment
ссылка не работает, попробуйте это - commons.apache.org/proper/commons-collections/javadocs/ - person gauravphoenix; 10.10.2013
comment
@gauravphoenix Я обновил ссылку. Обратите внимание, что вы ссылаетесь на версию 2.1.1, хотя есть и версия 3.2.1. (4.0 все еще альфа) - person lbalazscs; 10.10.2013

Попробуйте заменить начало каждой записи новой строкой и вкладкой, как показано ниже.

myMap.toString().replace("[", "\n\t[");

person Ravindra Gullapalli    schedule 02.03.2013
comment
В этом подходе отсутствует надлежащая идентификация по пробелам. - person Vasiliy Kevroletin; 02.10.2014

Я не уверен на 100%, возможно, это то, что вы ищете и что вы назвали красивой печатью -

Map<Integer,String> map = new HashMap<Integer,String>();
...
for(Map.Entry<Integer,String> entry: map.entrySet()){
    System.out.println(entry.getKey()+" - "+ entry.getValue());
}
person Subhrajyoti Majumder    schedule 02.03.2013
comment
Это не делает отступов и не помогает мне с вложенными картами (или другими коллекциями). - person einpoklum; 02.03.2013
comment
Это просто итерация по одной карте. Если у вас есть вложенная коллекция, вы можете использовать вложенный цикл внутри нее. - person Subhrajyoti Majumder; 02.03.2013

Я искал печать вложенных коллекций на Java, которая привела меня сюда. Однако ответы работают только для Карт, поэтому я решил добавить свое решение для вложенных коллекций. Он создает вывод, подобный JSON, если вы хотите, чтобы новые строки добавляли «]\n», а не «]».

Обратите внимание, что это не даст красивого вывода, если Object[] содержит вложенные элементы. Вам нужно будет написать отдельный метод для работы с вложенными массивами. Также он не будет красиво печатать примитивные массивы, для этого вам понадобится оператор else для каждого типа примитивного массива.

private static <A extends Collection<B>, B> String nestedToString(A collection) {
    if (collection == null)
        return "null";

    String ret = "";

    Iterator<B> colIterator = collection.iterator();
    if (colIterator.hasNext()) {
        ret += '[';
        while (colIterator.hasNext()) {
            B object = colIterator.next();
            if (object == null) {
                ret += "null";
            } else if (object instanceof Collection) {
                ret += nestedToString((Collection) object);
            } else if (object instanceof Object[]) {
                ret += Arrays.deepToString((Object[]) object);
            } else {
                ret += object;
            }
            if (colIterator.hasNext()) {
                ret += ", ";
            }
        }
        ret += ']';
    }
    return ret;
}
person neilireson    schedule 11.05.2017