structures sheet data cheat book and algorithms java data-structures

book - java data structures cheat sheet



Java: print_r? (9)

La última vez pregunté cómo llenar una estructura de datos aquí . Ahora me gustaría saber si hay algo en Java, como el print_r que uso en PHP, para representar lo que he rellenado en los mapas y listas sin tener que hacer mi propio algoritmo.

¿Algunas ideas?


Llamar a String en la colección debe devolver una cadena que contenga todas las representaciones de cadena de elementos.

Sin embargo, esto no funcionará con las matrices incorporadas, ya que no tienen una anulación toString y solo le darán una dirección de memoria.


No hay equivalente para print_r en Java.

Pero para mapas o listas, puede usar el bucle foreach de esta manera:

List <String> list = …; // fills your list // print each list element for (String s : list) { System.out.println(s); }


No sé de un equivalente de print_r en java.

Pero...

Cada objeto tiene una implementación predeterminada del método toString (), las implementaciones de listas y mapas imprimen sus contenidos si llama aString () para ellos.

Si necesita imprimir alguna información de depuración, toString () puede ser el lugar que está buscando.


Para las matrices, la forma más fácil es Arrays.asList (array) .toString (). Generalmente implemento toString () en objetos que me gusta tener en salidas de depuración. Para los objetos generados (JAXB, etc.) aunque podría necesitar hacer una clase de utilidad para imprimirlo.



Dependiendo de exactamente lo que quiere hacer, la solución podría ser bastante simple. Lo siguiente no producirá la salida formateada que proporciona print_r, pero le permitirá generar la estructura de listas, matrices y mapas:

// Output a list final List<String> list = new ArrayList<String>(); list.add("one"); list.add("two"); list.add("three"); list.add("four"); System.out.println(list); // Output an array final String[] array = {"four", "three", "two", "one"}; System.out.println(Arrays.asList(array)); // Output a map final Map<String, String> map = new HashMap<String, String>(); map.put("one", "value"); map.put("two", "value"); map.put("three", "value"); System.out.println(map.entrySet());

Para otros tipos de objetos, puede usar la reflexión para crear una utilidad para este propósito.


Mi opinión acerca de la funcionalidad de print_r Java es la clase RecursiveDump que escribí. No es perfecto, pero me está funcionando bien. El uso es:

String output = RecursiveDump.dump(...);

Podría mejorarse usando genéricos, lo escribí hace muchos años, antes de saber de ellos. Además, mientras trata de lidiar con algunos tipos de Colección, con Objetos solo llamará al método toString() .

Pensé usar Reflection para extraer nombres de campo para las clases sin un toString() apropiado, pero como Spring Roo @RooToString puede escribir el método toString() para usted ...

Por supuesto, la alternativa es usar la herramienta de inspector de un depurador, pero a veces es más rápido usar impresiones.


Otros han mencionado el método toString() . Esto realmente solo es útil cuando el objeto implementa toString() . Si no se ha implementado correctamente, terminará con algo como esto: java.lang.Object@1b9240e .

Incluso si es un poco tedioso, todavía es fácil implementar toString() en sus propias clases, pero las clases de terceros no siempre lo implementarán. Está mucho mejor usando un depurador. La única razón por la que cosas como print_r existen en PHP es por la falta de un verdadero depurador. Creo que encontrará que ser capaz de establecer puntos de interrupción en lugar de utilizar un montón de declaraciones de impresión de diagnóstico dará como resultado un flujo de trabajo mucho más rápido y un código más limpio.


Realmente hay diferencia entre toString () en java e print_r () en PHP. Tenga en cuenta que también hay __toString () en php que es equivalente a toString () en java, por lo que esta no es realmente la respuesta.

print_r se usa cuando tenemos una estructura de objetos y nos gusta ver rápidamente el gráfico completo de objetos con sus valores.

Implementar toString en java para cada objeto no tiene el poder de compararlo con print_r.

En su lugar, usa gson. Hace el mismo trabajo que print_r

Gson gson = new GsonBuilder (). SetPrettyPrinting (). Create ();
System.out.println (gson.toJson (someObject));

De esta forma, no necesita implementar toString para cada objeto que necesita para probarlo.

Aquí está la documentación: http://sites.google.com/site/gson/gson-user-guide

Clases de demostración (en Java):

clase pública A {

int firstParameter = 0; B secondObject = new B();

}

clase pública B {

String myName = "this is my name";

}

Aquí está la salida en php con print_r:

Objeto
(
[firstParameter: private] => 0
[secondObject: private] => B Object
(
[myName: private] => este es mi nombre
)

)

Aquí está la salida en Java con gson:

{
"firstParameter": 0,
"segundo objeto": {
"myName": "este es mi nombre"
}
}