Multi-line pretty-printing of (nested) collections in Java

后端 未结 4 648
-上瘾入骨i
-上瘾入骨i 2020-12-17 22:39

I want to be able to (pretty-)print the contents of my maps.

They should have newlines and indentation rather than on a single line; ignoring the toString methods of

相关标签:
4条回答
  • 2020-12-17 22:52

    You can use the method MapUtils.debugPrint from the apache commons collections in order to print nested maps.

    This method prints a nicely formatted String describing the Map. Each map entry will be printed with key, value and value classname. When the value is a Map, recursive behaviour occurs.

    0 讨论(0)
  • 2020-12-17 22:52

    I was looking for a printing of nested collections in Java which brought me here. However the answers only work for Maps therefore I thought I'd add my solution for nested Collections. It produces a JSON like output, if you want newlines add "]\n" rather than ']'.

    Note that this will not produce pretty output if the Object[] contains nested elements. You would need to write a separate method to deal with nested arrays. Also it will not pretty print primitive arrays, for that you'd need an else statement for every primitive array type.

    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;
    }
    
    0 讨论(0)
  • 2020-12-17 22:53

    Try replacing the start of each entry with new line and tab like this

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

    0 讨论(0)
  • 2020-12-17 23:01

    I am not 100% sure, might be is this what you are looking for and which you called pretty printing -

    Map<Integer,String> map = new HashMap<Integer,String>();
    ...
    for(Map.Entry<Integer,String> entry: map.entrySet()){
        System.out.println(entry.getKey()+" - "+ entry.getValue());
    }
    
    0 讨论(0)
提交回复
热议问题