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

17
我希望能有一个方法,可以循环任何类型的数组并打印它们,我已经写了以下代码:
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+ ? - Preston
2
不幸的是,array.toString() 只是调用了 Object.toString(),然后你会得到类似 [C@e6f8730 的东西。我向 JDK 7 coin 项目负责人建议修复这个问题,但是我没有说服他。 ;) - Peter Lawrey
@Peter Lawrey 建议不错。他们反对的理由是什么?每个人都可以充分利用那个哈希值吗? - Bozho
他们说你可以使用Arrays.toString/equals/hashCode来实现你想要的功能。我指出Sun/Oracle提供了9个不同的数组辅助类,包括各种包中的Array/Arrays/ArrayUtils,这对于Java新手来说是一团糟。(更不用说Apache commons和Guava了)事实上,你可以通过修改/扩展Object来修复toString()等问题,而Idea/编译器也会接受它,但这是一个丑陋的hack。所以在我看来,这并不是一个很大的改变,因为你不需要改变JVM或IDE就可以使其工作。 - Peter Lawrey
我听说过 Joshua Bloch 看过这个,他觉得要做好这件事情实在是太复杂了。 - Peter Lawrey
顺便提一下,在您上面的代码中不需要泛型:public static void printArray(Object[] arr){ for(Object t: arr){ ... - newacct
4个回答

26

java.util.Arrays.toString(array) 可以完成。

  • commons-lang 也有类似的方法- ArrayUtils.toString(array)(但是建议使用JDK的)
  • commons-lang 允许自定义分隔符 - StringUtils.join(array, ',')
  • guava 也允许指定分隔符,并提供跳过 null 值的选项:Joiner.on(',').skipNulls().join(array)

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

遗憾的是,后两个选项不支持原始数组,但这也是需要了解的好方法。


Guava的Joiner仅适用于对象数组。对于原始数组,您可以在com.google.common.primitives中使用join()方法(例如Chars.join():http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/primitives/Chars.html) - Etienne Neveu
@Bozho:是的,但我也想链接到原始类型的连接方法,因为这似乎是提问者想要的;)这不是批评,只是建议将其添加到您的答案中。 - Etienne Neveu
然而,java.util.Arrays.toString() 的任何特定调用并不能在“任何类型的数组”上工作,正如 OP 所希望的那样。它只能在 Object[]、int[] 或 double[] 等类型的数组上工作。你仍然需要分离出所有情况才能处理任何类型的数组。 - newacct
@newacct 是的,它通过重载实现。但是如果你有一个原始数组,在编译时就知道它的类型。 - Bozho
在commons-lang3(也许在commons-lang中)中,ArrayUtils.toString()方法在某些情况下具有一个显著的优势,即它能够正确地打印多维数组。内置版本只会打印内部数组的toString()值,而不是实际内容。 - khituras
显示剩余2条评论

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)

感谢回答,非常感激。 - user685275

1
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));
    }

0

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


感谢您的回答,非常感激。 - user685275

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接