打印数组中所有元素的通用方法
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)
应该可以。
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() 方法
【讨论】:
感谢您的回答,不胜感激。以上是关于打印数组中所有元素的通用方法的主要内容,如果未能解决你的问题,请参考以下文章
DevExpress Winform 通用控件打印方法(允许可自定义边距)