Estoy buscando una buena manera de imprimir bonitas a Map
.
map.toString()
me da {key1=value1, key2=value2, key3=value3}
Quiero más libertad en mis valores de entrada de mapa y estoy buscando algo más como esto: key1="value1", key2="value2", key3="value3"
Escribí este pequeño código:
StringBuilder sb = new StringBuilder();
Iterator<Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, String> entry = iter.next();
sb.append(entry.getKey());
sb.append('=').append('"');
sb.append(entry.getValue());
sb.append('"');
if (iter.hasNext()) {
sb.append(',').append(' ');
}
}
return sb.toString();
Pero estoy seguro de que hay una manera más elegante y concisa de hacer esto.
java
dictionary
pretty-print
mono espacial
fuente
fuente
System.out.println
están demasiado cerca. Y si desea algo personalizado, esto se reduce a "cómo iterar sobre un mapa en Java", que ciertamente tiene muchas otras respuestas.Respuestas:
O ponga su lógica en una pequeña clase ordenada.
Uso:
Nota: También puede poner esa lógica en un método de utilidad.
fuente
fuente
Map<String, Map<String,double[]>>
, entonces obtendrá este tipo de picar:[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
Echa un vistazo a la biblioteca de guayaba:
fuente
¡Bibliotecas Apache al rescate!
Todo lo que necesitas Apache commons-collections library ( enlace del proyecto )
Los usuarios de Maven pueden agregar la biblioteca usando esta dependencia:
fuente
Map<String, String[]>
). Solo se imprime su className y hash en lugar de los valores reales.Simple y fácil. Bienvenido al mundo JSON. Usando el Gson de Google :
Ejemplo de mapa con 3 llaves:
fuente
Cuando tengo
org.json.JSONObject
en el classpath, hago:(esto sangra maravillosamente listas, conjuntos y mapas que pueden estar anidados)
fuente
Usando Java 8 Streams:
fuente
,
Prefiero convertir el mapa a una cadena JSON:
admite tipos complejos anidados dentro del objeto
fuente
Mire el código para
HashMap#toString()
yAbstractMap#toString()
en las fuentes de OpenJDK:Entonces, si los chicos de OpenJDK no encontraron una manera más elegante de hacer esto, no hay ninguno :-)
fuente
Debería poder hacer lo que quiera haciendo:
System.out.println(map)
por ejemploMientras TODOS tus objetos en el mapa hayan anulado el
toString
método que verías :{key1=value1, key2=value2}
de una manera significativaSi esto es para su código, entonces anular
toString
es un buen hábito y le sugiero que lo haga.Para su ejemplo donde están sus objetos
String
, debería estar bien sin nada más.Es decir
System.out.println(map)
, imprimiría exactamente lo que necesita sin ningún código adicionalfuente
java.util.Map
no tiene contrato con respectotoString()
, por lo que depende de laMap
implementación real lo queSystem.out.println(map)
->PrintStream.println(map)
->String.valueOf(map)
->map.toString()
causará. Sucede que el uso frecuentejava.util.AbstractMap
proporciona una buena representación de cadena paratoString()
. ... OtrasMap
implementaciones pueden recurrir aObject.toString()
, lo que resulta en el no tan informativocom.example.MyMap@4e8c0de
.fuente
Supongo que algo como esto sería más limpio y le proporcionaría más flexibilidad con el formato de salida (simplemente cambie la plantilla):
Sé que tener que eliminar la última coma es feo, pero creo que es más limpio que otras alternativas como la de esta solución o el uso manual de un iterador.
fuente
Como apalancamiento solución rápida y sucia infraestructura existente, se puede envolver tu
uglyPrintedMap
en unajava.util.HashMap
, a continuación, utilizartoString()
.fuente
No responde exactamente la pregunta, pero vale la pena mencionar la
@ToString
anotación de Lombodok . Si anota con@ToString
laskey / value
clases, entonces haciendoSystem.out.println(map)
devolverá algo significativo.También funciona muy bien con mapas de mapas, por ejemplo:
Map<MyKeyClass, Map<String, MyValueClass>>
se imprimirá como{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }
fuente
String result = objectMapper.writeValueAsString(map)
¡Tan simple como esto!Resultado:
PD: agrega Jackson JSON a tu classpath.
fuente
Desde java 8 hay una manera fácil de hacerlo con Lambda:
fuente