Java中(嵌套)集合的多行漂亮打印

时间:2013-03-02 06:50:57

标签: java collections libraries pretty-print

我希望能够(漂亮地)打印我的地图内容。

他们应该有新行和缩进而不是单行;忽略collections / iterables / etc的toString方法;并递归到嵌套集合中。

对于我来说,这对地图尤为重要。我认为JSON可能是相关的,但我不想走那么远,或者至少 - 我不希望我的代码必须知道JSON只是为了让我能够打印出来它。我有什么选择(除了自己写这个)?

4 个答案:

答案 0 :(得分:15)

您可以使用apache commons集合中的方法MapUtils.debugPrint来打印嵌套映射。

  

此方法打印一个格式良好的String,用于描述Map。每个地图条目都将打印出键,值和值类名。当值为Map时,会发生递归行为。

答案 1 :(得分:3)

尝试使用新行和标签替换每个条目的开头

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

答案 2 :(得分:1)

我不是百分百肯定,可能是你正在寻找的,你称之为漂亮的印刷 -

Map<Integer,String> map = new HashMap<Integer,String>();
...
for(Map.Entry<Integer,String> entry: map.entrySet()){
    System.out.println(entry.getKey()+" - "+ entry.getValue());
}

答案 3 :(得分:1)

我正在寻找用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;
}