[英]Print arrays in 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[]
的實例,則先使用反射創建一個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<length; i++)
objArr[i] = Array.get(aObject, i);
System.out.println(Arrays.toString(objArr));
}
}
}
測試:
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方法(為了獲得比打印類名和哈希代碼更有用的東西......),你需要使用反射來獲取對象的更深層結構。
我的建議是使用一個使用反射來訪問更深層結構的庫,例如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()方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.