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.printlnestá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.JSONObjecten 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
toStringmétodo que verías :{key1=value1, key2=value2}de una manera significativaSi esto es para su código, entonces anular
toStringes 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.Mapno tiene contrato con respectotoString(), por lo que depende de laMapimplementación real lo queSystem.out.println(map)->PrintStream.println(map)->String.valueOf(map)->map.toString()causará. Sucede que el uso frecuentejava.util.AbstractMapproporciona una buena representación de cadena paratoString(). ... OtrasMapimplementaciones 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
uglyPrintedMapen unajava.util.HashMap, a continuación, utilizartoString().fuente
No responde exactamente la pregunta, pero vale la pena mencionar la
@ToStringanotación de Lombodok . Si anota con@ToStringlaskey / valueclases, 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