2014-11-11 4 views
2

객체를 입력으로 허용하는 로거가 있는데, 그것은 나에게 편리합니다. 하지만 이제는 int[] 유형의 입력을 기록해야합니다. 어떤 배열이나 Iterable을 적절하게 기록 할 수 있도록 메소드를 수정하고 싶습니다.개체로 변환 된 배열을 인쇄하려면 어떻게합니까?

C#에서

, 내가 무엇을 할 것이라고하는 것은 이것이다 :

int[]data=new int[10]; 
object tmp=data; 

..... 

if (tmp is IEnumerable) 
{ 
    StringBuilder _tmp = new StringBuilder(); 
    foreach (var i in (IEnumerable)tmp) 
    { 
     if (_tmp.Length > 0) 
     { 
      _tmp.Append(","); 
     } 
     _tmp.Append(i); 
    } 
    var r = _tmp.ToString(); 
} 

나는 작동 tmp.getClass().isArray()으로 확인 시도보다, Iterable에 대한 int[]을 (그렇지 않은) 검사를 시도했지만, 지금은 문제 열거가 그 배열의 멤버. 모든 배열이나 객체 목록에서 작동하는 메서드가 필요합니다.

Java에서 어떻게 올바르게 수행 할 수 있습니까?

+1

시도'tmp.getClass().는 getComponentType()' – kingdamian42

+0

왜 같은 java.lang.reflect.Array의 방법을 사용할 수 있습니다 타입 정보를 떨어 뜨릴거야? –

+0

@ElliottFrisch 로거 메소드는'Log (Object ... arguments)'처럼 보입니다. 사용하기에 정말 편리합니다. –

답변

2

당신은

Object obj = new int[] { 1, 2, 3, 4 }; 
try { 
    int len = Array.getLength(obj); 
    for (int i = 0; i < len; i++) { 
     if (i != 0) { 
      System.out.print(", "); 
     } 
     System.out.print(Array.get(obj, i)); 
    } 
    System.out.println(); 
} catch (IllegalArgumentException iae) { 
    iae.printStackTrace(); 
} 

출력

1, 2, 3, 4

0

Java (*)에서이를 수행 할 수있는 확실한 방법이 없을 수 있습니다. 나는이 일을 생각 :

Object tmp = ...; 

String s; 
if (tmp instanceof boolean[]) { 
    s = Arrays.toString((boolean[]) tmp); 
} 
else if (tmp instanceof byte[]) { 
    s = Arrays.toString((byte[]) tmp); 
} 
else ... 

char[]에 대해 동일한 작업을 수행, double[], float[], int[], long[], short[]; isArray()true이며이

s = Arrays.toString((Object[]) tmp); 

편집, 위 각 호의 어느 하나에 해당하는 경우가 아니라면 : 나는이 테스트를했는데 그것을 작동합니다.

Arrays.toString 방법 목록은 this javadoc을 참조하십시오.

(*) OK, Array.get을 사용하면 다른 답변과 마찬가지로 더 깨끗한 접근 방법 일 수 있습니다. 나는 그것을 테스트했고 너무 효과적이다.

관련 문제