【问题标题】:Multi-line pretty-printing of (nested) collections in JavaJava中(嵌套)集合的多行漂亮打印
【发布时间】:2013-02-16 18:41:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: java collections libraries pretty-print


    【解决方案1】:

    我正在寻找用 Java 打印的嵌套集合,它把我带到了这里。然而,答案只适用于地图,因此我想我会为嵌套集合添加我的解决方案。如果您想要换行符添加“]\n”而不是“]”,它会产生类似 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;
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      【解决方案3】:

      尝试将每个条目的开头替换为这样的新行和标签

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

      【讨论】:

      • 这种方法缺乏正确的空格标识。
      【解决方案4】:

      我不是 100% 确定,这可能是您正在寻找的,并且您称之为 漂亮的印刷 -

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

      【讨论】:

      • 这不会缩进,也不会帮助我处理嵌套地图(或其他集合)。
      • 它只是对单个地图的迭代。如果您有嵌套集合,您可以在其中使用嵌套循环。
      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 2011-03-14
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2014-11-09
      相关资源
      最近更新 更多