【问题标题】:Java: print_r?Java:打印_r?
【发布时间】:2008-09-29 10:28:40
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: java data-structures


    【解决方案1】:

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

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

    【讨论】:

    • 我在一个自定义类上试过这个,它输出ClassName@<address_value>。在自定义类上使用什么?
    • @trusktr 对于自定义类,您必须重写 toString() 方法以使其返回您想要的。
    【解决方案2】:

    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 输出:

    {
    “第一个参数”:0,
    “第二个对象”:{
    "myName": "这是我的名字"
    }
    }

    【讨论】:

    • 不错的方法。但有一件事,我想要一种更简单的方法来做到这一点,而不需要任何第三方库
    【解决方案3】:

    根据您想要做什么,解决方案可能相当简单。以下不会产生 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

    【讨论】:

      【解决方案4】:

      你可以试试老旧的 Apache Commons Lang 的 ToStringBuilder

      【讨论】:

        【解决方案5】:

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

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

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • hi mate :) 是的,我想要类似 print_r 的东西,因为我没有考虑过使用调试器,因为正如你所说,我从来没有在 PHP 中使用过调试器。我将了解如何将调试器与 Java 一起使用! :)
          • 一套体面的日志记录在与调试器一起使用时是无价的,因为它使您可以比使用调试器更快速地跟踪到某个功能。日志记录在生产模式代码中也很有用,因为它通常是问题的唯一记录。
          【解决方案7】:

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

          但是……

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

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

          【讨论】:

            【解决方案8】:

            在 Java 中没有 print_r 的等价物。

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

            List <String> list = …; // fills your list 
            
            // print each list element 
            
            for (String s : list) {
            
               System.out.println(s);
            
             }
            

            【讨论】:

            • 您也可以为此使用迭代器.. List list = ...;迭代器迭代器;迭代器 = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next() + ", "); }
            • java 中的 foreach 循环(无论如何是 IMO)比迭代器更简洁的语法,我相信它无论如何都在表面下使用迭代器。
            【解决方案9】:

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

            【讨论】:

            • 从 Java 1.5 开始,您可以改用 Arrays.toString(array)。
            猜你喜欢
            • 2011-10-28
            • 2017-03-01
            • 2013-05-01
            • 1970-01-01
            • 2019-01-24
            • 2012-02-15
            • 2014-05-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多