2010-06-30 124 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