18

上次我问如何在这里填充数据结构。现在我想知道 Java 中是否有某些东西,例如我在 PHP 中使用的print_r,来表示我在地图和列表中填充的内容,而无需执行我自己的算法。

有任何想法吗?

4

9 回答 9

10

在集合上调用 toString 应该返回一个包含所有元素字符串表示形式的字符串。

不过,这不适用于内置数组,因为它们没有 toString 覆盖,只会给你一个内存地址。

于 2008-09-29T10:39:59.323 回答
10

java 中的 toString() 和 PHP 中的 print_r() 之间确实存在差异。请注意,php 中还有 __toString() ,它相当于 java 中的 toString(),所以这不是真正的答案。

当我们有一个对象结构并且我们希望快速查看对象及其值的完整图时,使用 print_r。

在java中为每个对象实现toString没有与print_r相比的能力。

而是使用 gson。它和 print_r 做同样的工作

Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(someObject));

通过这种方式,您不需要为需要测试它的每个对象实现 toString。

这是文档: http ://sites.google.com/site/gson/gson-user-guide

演示类(在 java 中):

公共类 A {

int firstParameter = 0;
B secondObject = new B();

}

公共类 B {

String myName = "this is my name";  

}

这是带有 print_r 的 php 中的输出:

对象

[firstParameter:private] => 0
[secondObject:private] => B 对象

[myName:private] => 这是我的名字

)

这是带有gson的java中的输出:

{
"firstParameter": 0,
"secondObject": {
"myName": "这是我的名字"
}
}

于 2011-05-11T09:32:29.353 回答
8

根据您想要做什么,解决方案可能相当简单。以下不会产生 print_r 提供的格式化输出,但它允许您输出列表、数组和映射的结构:

    // Output a list
    final List<String> list = new ArrayList<String>();
    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");
    System.out.println(list);

    // Output an array
    final String[] array = {"four", "three", "two", "one"};
    System.out.println(Arrays.asList(array));

    // Output a map
    final Map<String, String> map = new HashMap<String, String>();
    map.put("one", "value");
    map.put("two", "value");
    map.put("three", "value");
    System.out.println(map.entrySet());

对于其他类型的对象,您可以使用反射来为此创建实用程序

于 2008-09-29T22:52:04.570 回答
7

您可以尝试旧的 Apache Commons Lang 的ToStringBuilder

于 2008-09-29T10:45:50.293 回答
2

其他人提到了这种toString()方法。这只有在对象实现时才有用toString()。如果它没有被正确实施,你最终会得到这样的结果:java.lang.Object@1b9240e.

即使有点繁琐,toString()在你自己的类中实现它仍然很容易,但第三方类并不总是会实现它。你最好使用调试器。PHP 中甚至存在类似的东西的唯一原因print_r是缺少真正的调试器。我想你会发现能够设置断点而不是使用一堆诊断打印语句将导致更快的工作流程和更清晰的代码。

于 2008-09-29T15:04:30.903 回答
2

我对类似 Javaprint_r的功能的看法是我编写的RecursiveDump类。它并不完美,但对我来说效果很好。用法是:

String output = RecursiveDump.dump(...);

它可以使用泛型来改进,我多年前写的,在我知道它们之前。此外,当它尝试处理某些 Collection 类型时,它只会调用 ObjectstoString()方法。

我想使用反射来提取没有适当的类的字段名称toString(),但是由于Spring Roo @RooToString可以为您编写toString()方法......

当然,替代方法是使用调试器的检查器工具,但有时使用打印更快。

于 2011-10-25T16:11:16.657 回答
0

我不知道 java 中的 print_r 等价物。

但...

每个对象都有一个 toString() 方法的默认实现,如果您为它们调用 toString(),则列表和映射实现会打印它们的内容。

如果您需要打印出任何调试信息,toString() 可能就是您要查找的地方。

于 2008-09-29T10:42:23.250 回答
0

Java 中没有 print_r 的等价物。

但是对于地图或列表,您可以像这样使用 foreach 循环:

List <String> list = …; // fills your list 

// print each list element 

for (String s : list) {

   System.out.println(s);

 }
于 2008-09-29T10:49:13.810 回答
0

对于数组,最简单的方法是 Arrays.asList(array).toString() 。我通常在调试输出中喜欢的对象上实现 toString()。对于生成的对象(JAXB 等),虽然可能需要创建一个实用程序类来打印它。

于 2008-09-29T10:52:03.617 回答