用Java打印数组

我正在编写一个方法来打印它传递的每个Object。 通过为对象调用Object.toString()方法可以正常工作,但不适用于数组。 我可以通过Object.getClass().isArray()方法找出它是否是一个数组,但我不知道如何转换它。

 int[] a; Integer[] b; Object aObject = a; Object bObject = b; // this wouldn't work System.out.println(Arrays.toString(aObject)); System.out.println(Arrays.toString(bObject)); 

如果您不知道类型,可以将对象强制转换为Object[]并像这样打印(确保它确实是一个数组并且可以转换为Object[] )。 如果它不是Object[]的实例,则先使用reflection创建一个Object[] ,然后打印:

 private void printAnyArray(Object aObject) { if (aObject.getClass().isArray()) { if (aObject instanceof Object[]) // can we cast to Object[] System.out.println(Arrays.toString((Object[]) aObject)); else { // we can't cast to Object[] - case of primitive arrays int length = Array.getLength(aObject); Object[] objArr = new Object[length]; for (int i=0; i 

测试:

 printAnyArray(new int[]{1, 4, 9, 16, 25}); printAnyArray(new String[]{"foo", "bar", "baz"}); 

OUTPUT:

 [1, 4, 9, 16, 25] [foo, bar, baz] 

如果您正在询问如何以编程方式在任何数组上调用此方法,那么原始数组就无法实现。 查看Arrays类的文档,您会看到每个基本数组类型都有toString()的重载。

这是因为int[]例如扩展了Object而不是Object[]

编辑:这是一个令人遗憾的长期解决方案,包括原始数组:

 public static void printObject(Object obj) { String output; if (obj == null) { output = "null"; } else if (obj.getClass().isArray()) { if (obj instanceof Object[]) { output = Arrays.toString((Object[])obj); //Object[] overload } else if (obj instanceof int[]) { output = Arrays.toString((int[])obj); //int[] overload } //and so on for every primitive type } else { output = obj.toString(); } System.out.println(output); } 

我希望其他人可以提供更优雅的解决方案,但基于原始数组的限制,这可能是您可以做的最好的。

你为什么不让方法重载解决你的问题? 只需编写两个(或更多)具有相同名称但签名不同的方法,然后让编译器决定程序执行时将调用哪个方法:

 void print(Object object) { System.out.println("Object: " + object); } void print(Object[] array) { System.out.println("Object[]: " Arrays.toString(array)); } void print(int[] array) { System.out.println("int[]: " Arrays.toString(array)); } 

代码中其他地方的示例用法:

 String first = "test"; print(first); // prints "Object: test"; String[] second = {"A", "B"}; print(second); // prints "Object[]: [A, B]" int[] third = {1, 2}; print(third); // prints "int[]: [1, 2]" 

如果你不想依赖于对象的类本身来重载Object toString方法(为了获得比打印类名和哈希代码更有用的东西……),你需要使用reflection来获取对象的更深层结构。

我的建议是使用一个使用reflection来访问更深层结构的库,例如GSON: http : //code.google.com/p/google-gson/

 public static String print(Object object) { return new Gson().toJson(object); } public static void test() { System.out.println(print(new int[][] {new int[] {1, 2, 3} })); // outputs: [[1,2,3]] System.out.println(print(new String[] { "aa", "bb", "cc" })); // outputs: ["aa","bb","cc"] } 

这可以毫不费力地打印数组,包括多维数组和原始数组。

但真正的好处是它以统一的方式打印任何类的对象,无论该类是否以任何有用的方式覆盖toString。

如果您只想将其打印为String,为什么要将其打印出来呢? 只需将其视为一个Object数组,遍历数组,并在每个Object上调用toString()方法。