2010-06-30 122 views
4

所以,我已經發現漂亮的打印數組對象,而不是對象數組?

Arrays.toString(arr); 

所以不要點我this question

我的問題只是有點不同。在這種情況下,我沒有一個本地數組指針指向有問題的數組。我把它作爲一個Object指針,它可以是任何類型的數組(原始或其他)。在這種情況下,我可以通過將Object指針強制轉換爲Object []來使用上面的toString()方法。但是,如果指針是一個基本數組,它將引發運行時異常並崩潰。所以?

例子:

double test[] = {1, 2, 3, 4}; 
Object t = test; 
// Now how do I pretty print t as an array with no access to test? 

我解決我的問題與此:

public String unkObjectToString(Object o) { 
    if(!o.getClass().isArray()) return o.toString(); 
    int len = Array.getLength(o); 
    String ret = "["; 
    for(int i = 0; i < len; i++) { 
     Object q = Array.get(o, i); 
     ret += unkObjectToString(q); 
     if(i == len - 1) 
      ret += "]"; 
     else 
      ret += ", "; 
    } 
    return ret; 
} 

回答

2

您必須測試和演員。

if (o instanceof byte[]) { 
     return Arrays.toString((byte[]) o); 
} //etc. 

你可以通過反射來做到這一點,但最終不會有任何更清潔的東西,儘管它可能少了幾行代碼。

+0

我向編程的神聖之神祈禱,這可以避免,而StackOverflow是我的最後一招。我現在會執行這種可憎的事,但知道我的靈魂隨着即將到來的承諾而被提到地獄的深處。和平,你,兄弟。 *致敬* – Jordan 2010-06-30 20:19:29

+0

拋開戲劇,爲什麼這麼打擾你呢? 10行額外的代碼足以讓你覺得你失去了你的無辜?這些原語不是對象是Java中的核心現實。如果這讓你感到困擾,那麼,克服它,或選擇另一種語言。 – 2010-06-30 20:33:39

+0

它主要困擾我,因爲我正在工作的代碼具有if-else鏈的公平份額,1000行可能很容易被避免,但現在已經在項目中根深蒂固,我希望避免添加鏈接鏈。我用一個遞歸函數修正它(以幫助嵌套數組),類似於Bozho的庫函數。我會將這個函數加入到我的問題中以供參考和批評。 – Jordan 2010-06-30 20:48:14

2

ArrayUtils.toString(arrayObj)commons-lang) - 正是你想要的(也處理多維數組)。只需下載commons-lang jar並將其添加到您的類路徑中即可。

+0

雖然我無法引入你忠實的遵守,但現在我的任務是按照自然法則的允許,儘可能最好地轉化你的建議的精神。 – Jordan 2010-06-30 20:24:06

+0

爲什麼你不能導入它?下載commons-lang,將它添加到classpath中,並且你完成了 – Bozho 2010-06-30 20:25:43

+0

因爲Jordan不能使用額外的庫,或者因爲commons-lang可能與Jordan正在使用的JDK版本不兼容。真的有那麼多人仍在使用1.3? – JAB 2010-06-30 20:28:04