簡體   English   中英

用Java打印數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM