Java:print_r?

时间:2008-09-29 10:28:41

标签: java data-structures

上次我问过如何填充数据结构here。现在我想知道Java中是否存在某些东西,比如我在PHP中使用的print_r来表示我在地图和列表中填充的内容,而不必使用我自己的算法。

有什么想法吗?

9 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:9)

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";  
     

}

以下是php中带print_r的输出:

  

对象
  (
      [firstParameter:private] => 0
      [secondObject:private] => B对象
          (
              [myName:private] =>这是我的名字
          )

     

以下是带有gson的java输出:

  

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

答案 2 :(得分: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());

对于其他类型的对象,您可以使用reflection为此目的创建utility

答案 3 :(得分:7)

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

答案 4 :(得分:2)

其他人提到了toString()方法。这仅在对象实现toString()时才有用。如果没有正确实施,您最终会得到如下内容:java.lang.Object@1b9240e

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

答案 5 :(得分:2)

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

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

使用仿制药可以改进,我在很多年前写过它,然后才知道它们。此外,当它尝试处理某些Collection类型时,对象只会调用toString()方法。

我想使用Reflection来提取没有正确toString()的类的字段名称,但是因为Spring Roo @RooToString可以为您编写toString()方法... < / p>

当然,另一种方法是使用调试器的检查器工具,但有时使用打印机的速度会更快。

答案 6 :(得分:0)

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

但是...

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

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

答案 7 :(得分:0)

Java中没有print_r的等价物。

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

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

// print each list element 

for (String s : list) {

   System.out.println(s);

 }

答案 8 :(得分:0)

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