Estou procurando uma boa maneira de imprimir bonito a Map
.
map.toString()
me dá: {key1=value1, key2=value2, key3=value3}
Quero mais liberdade nos meus valores de entrada no mapa e estou procurando algo mais como este: key1="value1", key2="value2", key3="value3"
Eu escrevi este pequeno pedaço de 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();
Mas tenho certeza de que há uma maneira mais elegante e concisa de fazer isso.
java
dictionary
pretty-print
space_monkey
fonte
fonte
System.out.println
estão muito próximos. E se você quiser algo personalizado, tudo se resume a "como iterar sobre um mapa em Java", que certamente tem muitas outras respostas.Respostas:
Ou coloque sua lógica em uma turma pequena e organizada.
Uso:
Nota: Você também pode colocar essa lógica em um método utilitário.
fonte
fonte
Map<String, Map<String,double[]>>
, então você vai ter este tipo de picar:[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
Dê uma olhada na biblioteca do Guava:
fonte
Bibliotecas Apache para o resgate!
Tudo o que você precisa na biblioteca de coleções comuns do Apache ( link do projeto )
Os usuários do Maven podem adicionar a biblioteca usando esta dependência:
fonte
Map<String, String[]>
). Somente o nome da classe e o hash são impressos em vez dos valores reais.Simples e fácil. Bem-vindo ao mundo JSON. Usando o Gson do Google :
Exemplo de mapa com 3 teclas:
fonte
Quando estou
org.json.JSONObject
no caminho de classe, faço:(isso recorta listas, conjuntos e mapas maravilhosamente aninhados)
fonte
Usando o Java 8 Streams:
fonte
,
Eu prefiro converter o mapa em uma string JSON:
suporta tipos complexos aninhados dentro do objeto
fonte
Veja o código para
HashMap#toString()
eAbstractMap#toString()
nas fontes OpenJDK:Portanto, se os caras do OpenJDK não encontraram uma maneira mais elegante de fazer isso, não há :-)
fonte
Você deve conseguir fazer o que deseja, fazendo:
System.out.println(map)
por exemploDesde que TODOS os seus objetos no mapa tenham sobreposto ao
toString
método que você veria:{key1=value1, key2=value2}
de uma maneira significativaSe esse for o seu código, substituir
toString
é um bom hábito e sugiro que você faça isso.Para o seu exemplo onde seus objetos estão,
String
você deve ficar bem sem mais nada.Ou seja
System.out.println(map)
, imprimiria exatamente o que você precisa sem nenhum código extrafonte
java.util.Map
não possui contratotoString()
, portanto, depende daMap
implementação real o queSystem.out.println(map)
->PrintStream.println(map)
->String.valueOf(map)
->map.toString()
causará. Acontece que o frequentemente usadojava.util.AbstractMap
fornece uma boa representação de strings paratoString()
. ... OutrasMap
implementações podem voltar aoObject.toString()
, o que resulta no não tão informativocom.example.MyMap@4e8c0de
.fonte
Eu acho que algo assim seria mais limpo e fornecer mais flexibilidade com o formato de saída (basta alterar o modelo):
Eu sei que ter que remover a última vírgula é feio, mas acho que é mais limpo do que alternativas como a desta solução ou manualmente usando um iterador.
fonte
Como uma solução rápida e suja que utiliza a infraestrutura existente, você pode agrupá-lo
uglyPrintedMap
em umjava.util.HashMap
e usá-lotoString()
.fonte
Não responde exatamente à pergunta, mas vale a pena mencionar a
@ToString
anotação Lombodok . Se você anotar com@ToString
askey / value
classes,System.out.println(map)
o return retornará algo significativo.Também funciona muito bem com mapas de mapas, por exemplo:
Map<MyKeyClass, Map<String, MyValueClass>>
será impresso como{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }
fonte
String result = objectMapper.writeValueAsString(map)
- simples assim!Resultado:
PS adicione Jackson JSON ao seu caminho de classe.
fonte
Desde o java 8, há uma maneira fácil de fazer isso com o Lambda:
fonte