打印数组中所有元素的通用方法

Posted

技术标签:

【中文标题】打印数组中所有元素的通用方法【英文标题】:generic method to print all elements in an array 【发布时间】:2011-08-17 05:50:30 【问题描述】:

我想要一个可以循环任何类型数组并打印它们的方法,我写了以下内容:

public static <T> void printArray(T[] arr)
    for(T t: arr)
       System.out.print(t+" ");
    
    System.out.println("");

但是这个只适用于类数组,如果我有一个char[] 而不是一个Character[],或者一个int[] 而不是一个Integer[],或者有什么办法可以预先将它们转换?谢谢

【问题讨论】:

用 t.toString() 代替 t+ 怎么样 不幸的是 array.toString() 只是调用了 Object.toString() 并且你得到了类似[C@e6f8730 我建议 JDK 7 硬币项目负责人他解决了这个问题,但我没有把它卖给他. ;) @Peter Lawrey 好建议。他们反对的理由是什么?每个人都可以充分利用该哈希值吗? 他们说你可以使用 Arrays.toString/equals/hashCode 来做你想做的事。我指出 Sun/Oracle 为数组提供了 9 个不同的帮助程序类,包括各种包中的 Array/Arrays/ArrayUtils,而且对于刚接触 Java 的人来说,这简直是一团糟。 (更不用说 Apache commons 和 Guava)事实上,您可以破解/扩展 Object 来修复 toString() 等,并且 Idea/编译器接受它,但它是一个丑陋的 hack。所以恕我直言,这并没有那么大的变化,因为您无需更改 JVM 或 IDE 即可使其正常工作。 我听说 Joshua Bloch 看过这个,我听说他觉得要真正做好这件事太复杂了。 【参考方案1】:

java.util.Arrays.toString(array) 应该可以。

commons-lang 也有 - ArrayUtils.toString(array)(但更喜欢 JDK) commons-lang 允许自定义分隔符 - StringUtils.join(array, ',') guava 也允许使用分隔符,并且可以选择跳过空值:Joiner.on(',').skipNulls().join(array)

所有这些都返回String,然后您可以使用System.out.println(..)logger.debug(..)。请注意,如果数组的元素以有意义的方式实现了toString(),这些将为您提供有意义的输入。

最后两个选项,唉,不支持原始数组,但很好的选择。

【讨论】:

Guava 的 Joiner 仅适用于 object 数组。对于原始数组,您可以在 com.google.common.primitives 中使用 join() 方法(例如 Chars.join() : guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/… ) @eneveu 在我的最后一段中;) @Bozho:是的,但我也想链接到原始类型的连接方法,因为这似乎是提问者所追求的;)这不是批评,只是建议添加这是你的答案。 仍然,java.util.Arrays.toString() 的任何特定调用都不适用于 OP 想要的“任何类型的数组”。它只能在 Object[] 或 int[] 或 double[] 等上工作。您仍然需要将所有情况分开才能在任何类型的数组上工作 @newacct 它通过重载工作,是的。但是如果你有一个原始数组,你在编译时就知道它的类型。【参考方案2】:

您不能为原始数组编写通用定义。相反,您可以像这样使用方法重载并为每个原始数组类型编写一个方法,

public static void printArray(int[] arr)
public static void printArray(short[] arr)
public static void printArray(long[] arr)
public static void printArray(double[] arr)
public static void printArray(float[] arr)
public static void printArray(char[] arr)
public static void printArray(byte[] arr)
public static void printArray(boolean[] arr)

【讨论】:

感谢您的回答,不胜感激。【参考方案3】:
private static void printArray(Object arr) 
        // TODO Auto-generated method stub
        String arrayClassName=arr.getClass().getSimpleName();
        if (arrayClassName.equals("int[]"))
            System.out.println(java.util.Arrays.toString((int[]) arr));
        if (arrayClassName.equals("char[]"))
            System.out.println(java.util.Arrays.toString((char[]) arr));
    

【讨论】:

【参考方案4】:

您不能将原始数组传递给 printArray() 方法

【讨论】:

感谢您的回答,不胜感激。

以上是关于打印数组中所有元素的通用方法的主要内容,如果未能解决你的问题,请参考以下文章

c#打印一个由通用列表组成的数组列表

DevExpress Winform 通用控件打印方法(允许可自定义边距)

DevExpress Winform 通用控件打印方法(允许可自定义边距) z

让js中数据类型的所有方法都通用起来

numpy的通用函数:快速的元素级数组函数

numpy 通用函数