2010-06-30 3 views
4

그래서, 난 이미객체의 배열이 아닌 배열 객체를 인쇄 하시겠습니까?

Arrays.toString(arr); 

그래서 this question에 나를 가리 키지 발견했습니다.

내 문제는 아주 조금 다릅니다. 이 경우 문제의 배열에 대한 기본 배열 포인터가 없습니다. 나는 그것을 Object 포인터로 가지며, 어떤 타입의 배열 (primitive 또는 다른 것)이 될 수있다. 이 경우 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가 나의 마지막 수단이었습니다. 나는이 가증 한 일을 지금 당장 수행 할 것이지만 내 영혼은 다가오는 저서와 함께 지옥의 깊은 곳까지 제공된다는 것을 알아야한다. 너에게 평화가있어, 형. * salute * – Jordan

+0

Dramatics는 제쳐두고, 왜 이것이 당신을 그렇게 괴롭히는가? 10 줄의 여분의 코드만으로도 당신의 무죄를 잃어버린 느낌이들 것입니다. 그 원시물은 객체가 아니라 Java에서 핵심적인 현실입니다. 이것이 너를 그렇게 괴롭히는 것이라면, 그걸 극복하거나 다른 언어를 선택하십시오. –

+0

내가 작업하고있는 코드가 쉽게 피할 수 있었지만 현재 프로젝트에 뿌리 내리고있는 if-else 체인 1000 선의 공평한 분배를 갖고 있기 때문에 체인에 링크를 추가하는 것을 피하기를 바랬 기 때문에 대부분 나를 귀찮게한다. . Bozho의 라이브러리 함수가했던 것과 비슷한 재귀 함수 (중첩 된 배열을 돕기 위해)를 수정했습니다. 참조 및 비평을 위해이 함수를 제 질문에 추가합니다. – Jordan

2

ArrayUtils.toString(arrayObj) (commons-lang) - 정확히 원하는대로 수행합니다 (다차원 배열 처리). 단순히 commons-lang 항아리를 다운로드하여 classpath에 추가하십시오.

+0

나는 당신의 충실한 준수를 가져올 수는 없지만, 이제는 자연의 법칙에 의해 허용되는 한 최선을 다해 당신의 제안의 정신을 환생시키는 것이 나의 임무입니다. – Jordan

+0

왜 가져올 수 없습니까? commons-lang을 다운로드하고 classpath에 추가하면 완료됩니다. – Bozho

+0

Jordan이 추가 라이브러리를 사용할 수 없거나 commons-lang이 Jordan이 사용중인 JDK 버전과 호환되지 않을 수 있기 때문입니다. 실제로 많은 사람들이 여전히 1.3을 사용하고 있습니까? – JAB