用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()方法。