【问题标题】: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 看过这个,我听说他觉得要真正做好这件事太复杂了。

标签: java arrays generics methods


【解决方案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() 方法

    【讨论】:

    • 感谢您的回答,不胜感激。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 2021-06-06
    • 2019-04-03
    • 2021-04-07
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多