2012-01-18 35 views
7

Estoy escribiendo un método que imprime todos los Objetos que se pasan. Esto funciona bien llamando al método Object.toString() para el objeto, pero no funciona para las matrices. Puedo averiguar si se trata de una matriz con el método Object.getClass().isArray(), pero no sé cómo lanzarlo.Imprimir matrices en Java

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)); 

Respuesta

12

Si no conoce el tipo, puede convertir el objeto a Object[] e imprimirlo de esta manera (después de asegurarse de que se trata de una matriz y se puede convertir a Object[]). Si no es una instancia de Object[] a continuación, utilizar reflexión para crear una primera Object[] y luego de impresión:

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)); 
     } 
    } 
} 

PRUEBA:

printAnyArray(new int[]{1, 4, 9, 16, 25}); 
printAnyArray(new String[]{"foo", "bar", "baz"}); 

SALIDA:

[1, 4, 9, 16, 25] 
[foo, bar, baz] 
+0

¿Cómo podría averiguar si se trata de una matriz primitiva? También necesito saber el tipo primitivo de la matriz. – multiholle

+0

@multiholle - Ver mi edición. –

+0

Por favor, compruebe el código actualizado, ** ahora imprima cualquier objeto de matriz ** sin necesidad de convertir a cada tipo primitivo en una cadena fea de 'if/elseif/else' – anubhava

1

Si estás preguntando cómo se puede llamar a este método de programación en cualquier matriz, no va a ser posible con matrices primitivas. Mirando los documentos para la clase Arrays, verá que hay una sobrecarga de toString() para cada tipo de matriz primitiva.

Esto es porque int[] por ejemplo se extiende Object en lugar de Object[].

EDIT: he aquí una solución, lamentablemente longwinded incluir matrices primitivas:

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); 
} 

Estoy esperando que alguien más puede ofrecer una solución más elegante, pero en base a las limitaciones de las matrices primitivas, esto podría ser lo mejor que puedes hacer

-2

Si todo lo que quiere hacer es imprimirlo como una cadena, ¿por qué lanzarlo? Simplemente trátelo como una matriz de Objetos, recorra la matriz y llame al método toString() en cada Objeto.

+0

Pero no puedo convertirlo en una matriz 'Objeto' si contiene tipos primitivos. – multiholle

1

¿Por qué no dejas que method overloading resuelva tu problema? Basta con escribir dos (o más) métodos con el mismo nombre pero diferentes firmas y luego dejar que el compilador de decidir qué método será llamado cuando el programa se ejecuta:

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)); 
} 

Ejemplo de uso en otra parte del código:

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]" 
0

Necesita usar la reflexión para llegar a la estructura más profunda de un objeto si no desea confiar en la clase del objeto para sobrecargar el método Object toString (para obtener algo más útil que imprimir el nombre de clase y el código hash ...)

Mi suggestio n es utilizar una biblioteca que utiliza la reflexión para llegar a la estructura más profunda, como 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"] 
} 

Esto imprime matrices sin esfuerzo, incluidas las matrices multidimensionales y matrices primitivas.

Pero el beneficio real es que imprime objetos de cualquier clase de una manera uniforme, ya sea que la clase haya reemplazado a String de alguna manera útil o no.