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

问题描述 投票:0回答:5

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

它们应该有换行符和缩进,而不是在一行上;忽略集合/可迭代等的 toString 方法;并递归到嵌套集合中。

我对地图特别感兴趣。我认为 JSON'ing 可能是相关的,但我不想走那么远,或者至少 - 我不希望我的代码必须了解 JSON 只是为了我能漂亮地打印它。我有什么选择(除了我自己写这个)?

java collections libraries pretty-print
5个回答
15
投票

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

此方法打印一个格式良好的描述地图的字符串。每个映射条目都将打印有键、值和值类名。当值为 Map 时,会发生递归行为。


4
投票

尝试用新行和选项卡替换每个条目的开头,如下所示

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


1
投票

我不是100%确定,可能这就是你正在寻找的东西,你称之为漂亮的印刷 -

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

1
投票

我正在寻找 Java 中嵌套集合的打印,这将我带到了这里。然而,答案仅适用于地图,因此我想我应该添加嵌套集合的解决方案。它会生成类似 JSON 的输出,如果您想要换行符,请添加“] “而不是‘]’。

请注意,如果 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;
}

0
投票

我知道 OP 没有指定 JSON 解决方案,但我发现这样做非常轻量级并且非常适合我的要求:

    Gson gson = new GsonBuilder().setPrettyPrinting().create();     
    System.out.println(gson.toJson(myMap).replaceAll("\"","")); // Get rid of annoying "
© www.soinside.com 2019 - 2024. All rights reserved.