【问题标题】:Recursively dump the contents of an aggregate structure (Collection, Array) in Java在 Java 中递归转储聚合结构(集合、数组)的内容
【发布时间】:2012-06-14 05:30:16
【问题描述】:

这是我在 Stackoverflow 上的第一个问题,所以如果您在我的第一篇文章中发现任何荒谬之处,请多多包涵。仅供参考,我已经阅读了 SO FAQ,并且我知道它的各种政策。你看,我是一个大量使用 PHP、Perl、Python、ROR 等语言的人,最近我“上下文切换”到了 Java EE。你看,我研究过的几种语言都有一个结构,使我能够在没有 for/foreach/for..in 循环的情况下递归地转储聚合结构的内容

例如,

a = 任何复合数据结构

PHP 有

var_dump() 和 print_r() 

Perl 有

数据::Dumper

ROR 有

漂亮的打印

Python 有

打印模块

所以我的问题是,

在 Java 世界中是否有与这些类似的东西?当我使用这些语言(PHP/Perl/Python/ROR)中的任何一种来转储复合数据结构的内容以检查它的外观然后进一步处理它(或决定如何处理)时,我发现它非常方便。进一步处理)

感谢您的宝贵时间,如果我的帖子忽略了任何 SO 规则,我们深表歉意。

【问题讨论】:

  • 1) 欢迎来到 SO。 2) 关于你的 SO 礼仪,你唯一做错的事就是提到这么多关于 SO 的新手。问题要直截了当——当其他人搜索相同的主题时,他们并不关心你的人生故事。 :-)

标签: java


【解决方案1】:

java.util 集合具有toString(),它将递归地转储列表/集合/映射等的详细信息。这要求存储在集合中的对象具有有用的toString()s 定义。

但是,它对数组不起作用,因为 Java 没有用于数组的有用默认 toString()。如果您知道您正在处理一个数组,那么您可以使用Arrays.deepToString() 实用方法(有关详细信息,请参阅guido's response)。

例如这段代码:

final Map<String, Object> map = new HashMap<String, Object>();
final List<String> nested = Arrays.asList("foo", "bar", "baz");

map.put("given", "Arthur");
map.put("family", "Dent");
map.put("nested", nested);

System.out.println(map);

产生这个:

{nested=[foo, bar, baz], given=Arthur, family=Dent}

【讨论】:

  • 好的,这总结了你的答案和上面的答案。不知道我应该绿色检查哪一个 :) 非常感谢您的回复。
【解决方案2】:

您可以使用java.util.Arrays 类中的实用程序静态方法:

public static String toString(Object[] a)
ie: String dump = Arrays.toString(array);

返回指定数组内容的字符串表示形式。

如果数组包含其他数组作为元素,则通过继承自 Object 的 Object.toString() 方法将它们转换为字符串,该方法描述的是它们的标识而不是它们的内容。

此方法返回的值等于 Arrays.asList(a).toString() 将返回的值,除非 a 为 null,在这种情况下返回“null”。

public static String deepToString(Object[] a)
ie: String dump = Arrays.deepToString(array);

返回指定数组的“深层内容”的字符串表示形式。如果数组包含其他数组作为元素,则字符串表示包含它们的内容等等。该方法是为将多维数组转换为字符串而设计的。

字符串表示由数组元素的列表组成,括在方括号(“[]”)中。相邻元素由字符“,”(逗号后跟一个空格)分隔。元素通过 String.valueOf(Object) 转换为字符串,除非它们本身是数组。

如果是collections,可以使用toArray()方法:

 List<YourObject> list = .....
 YourObject[] array = list.toArray(new YourObject[0]);
 String dump = Arrays.deepToString(array);

【讨论】:

    【解决方案3】:

    根据您的目的,我假设您的目的是调试代码或探索复杂的数据结构,不要打印

    使用良好的 UI 调试器,例如 IntelliJ 或(颤抖,请不要)eclipse 中的调试器。与您列出的其他语言相比,Java 有一套更成熟、更完整的工具可供开发人员使用(我也使用过其中的大多数语言)。 Php、Perl 等是原始的,出于某种原因,人们一直期望在简单的文本编辑器中进行开发。 Java 不是那样工作的(至少如果你想保持清醒或者正在从事比玩具项目更大的工作)。

    使用功能齐全的 IDE,它内置调试器。

    在您列出的其他 IDE 中,IDE 并不是一个很好的选择,而且调试集成充其量也很糟糕……这实际上是 Java 的主要优势之一。

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 2014-03-31
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多