Imprimer une carte en Java

Je suis à la recherche d’un moyen agréable d’imprimer une Map .

map.toSsortingng() me donne: {key1=value1, key2=value2, key3=value3}

Je veux plus de liberté dans mes valeurs d’entrée de carte et je recherche quelque chose de plus: key1="value1", key2="value2", key3="value3"

J’ai écrit ce petit morceau de code:

 SsortingngBuilder sb = new SsortingngBuilder(); Iterator<Entry> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry entry = iter.next(); sb.append(entry.getKey()); sb.append('=').append('"'); sb.append(entry.getValue()); sb.append('"'); if (iter.hasNext()) { sb.append(',').append(' '); } } return sb.toSsortingng(); 

Mais je suis sûr qu’il existe un moyen plus élégant et concis de le faire.

Ou mettez votre logique dans une petite classe bien rangée.

 public class PrettyPrintingMap { private Map map; public PrettyPrintingMap(Map map) { this.map = map; } public Ssortingng toSsortingng() { SsortingngBuilder sb = new SsortingngBuilder(); Iterator> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry entry = iter.next(); sb.append(entry.getKey()); sb.append('=').append('"'); sb.append(entry.getValue()); sb.append('"'); if (iter.hasNext()) { sb.append(',').append(' '); } } return sb.toSsortingng(); } } 

Usage:

 Map myMap = new HashMap(); System.out.println(new PrettyPrintingMap(myMap)); 

Remarque: Vous pouvez également placer cette logique dans une méthode utilitaire.

 Arrays.toSsortingng(map.entrySet().toArray()) 

Jetez un coup d’œil à la bibliothèque Guava:

 Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("="); System.out.println(mapJoiner.join(map)); 

Les bibliothèques Apache à la rescousse!

 MapUtils.debugPrint(System.out, "myMap", map); 

Tout ce dont vous avez besoin Apache commons-collection library ( lien projet )

Les utilisateurs de Maven peuvent append la bibliothèque en utilisant cette dépendance:

  commons-collections commons-collections 3.2.1  

Quand j’ai org.json.JSONObject dans le classpath, je fais:

 Map stats = ...; System.out.println(new JSONObject(stats).toSsortingng(2)); 

(cela indente joliment les listes, ensembles et cartes qui peuvent être nestedes)

Simple et facile. Bienvenue dans le monde JSON. En utilisant Gson de Google :

 new Gson().toJson(map) 

Exemple de carte avec 3 clés:

 {"array":[null,"Some ssortingng"],"just ssortingng":"Yo","number":999} 

Je préfère convertir la carte en chaîne JSON:

  • une référence
  • lisible par l’homme
  • pris en charge dans les éditeurs tels que Sublime, VS Code, avec mise en évidence de la syntaxe, mise en forme et masquage / affichage des sections
  • prend en charge JPath afin que les éditeurs puissent signaler exactement quelle partie de l’object vous avez navigué
  • prend en charge les types complexes nesteds dans l’object

     import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public static Ssortingng getAsFormattedJsonSsortingng(Object object) { ObjectMapper mapper = new ObjectMapper(); try { return mapper.writerWithDefaultPrettyPrinter().writeValueAsSsortingng(object); } catch (JsonProcessingException e) { e.printStackTrace(); } return ""; } 

Regardez le code pour HashMap#toSsortingng() et AbstractMap#toSsortingng() dans les sources OpenJDK:

 class java.util.HashMap.Entry implements Map.Entry { public final Ssortingng toSsortingng() { return getKey() + "=" + getValue(); } } class java.util.AbstractMap { public Ssortingng toSsortingng() { Iterator> i = entrySet().iterator(); if (! i.hasNext()) return "{}"; SsortingngBuilder sb = new SsortingngBuilder(); sb.append('{'); for (;;) { Entry e = i.next(); K key = e.getKey(); V value = e.getValue(); sb.append(key == this ? "(this Map)" : key); sb.append('='); sb.append(value == this ? "(this Map)" : value); if (! i.hasNext()) return sb.append('}').toSsortingng(); sb.append(", "); } } } 

Donc, si les gars d’OpenJDK n’ont pas trouvé une manière plus élégante de le faire, il n’y en a pas 🙂

Utilisation de Java 8 Streams:

 Map map = new HashMap<>(); String content = map.entrySet() .stream() .map(e -> e.getKey() + "=\"" + e.getValue() + "\"") .collect(Collectors.joining(", ")); System.out.println(content); 
 public void printMapV2 (Map  map) { SsortingngBuilder sb = new SsortingngBuilder(128); sb.append("{"); for (Map.Entry entry : map.entrySet()) { if (sb.length()>1) { sb.append(", "); } sb.append(entry.getKey()).append("=").append(entry.getValue()); } sb.append("}"); System.out.println(sb); } 

Vous devriez pouvoir faire ce que vous voulez en faisant:

System.out.println(map) par exemple

Tant que TOUS vos objects sur la carte ont remplacé la méthode toSsortingng , vous verrez:
{key1=value1, key2=value2} d’une manière significative

Si cela est pour votre code, alors toSsortingng est une bonne habitude et je vous suggère de le faire à la place.

Pour votre exemple où vos objects sont des Ssortingng vous devriez vous en sortir sans rien d’autre.
Ie System.out.println(map) imprime exactement ce dont vous avez besoin sans code supplémentaire

Je suppose que quelque chose comme ça serait plus propre et vous donnerait plus de flexibilité avec le format de sortie (simplement changer de modèle):

  Ssortingng template = "%s=\"%s\","; SsortingngBuilder sb = new SsortingngBuilder(); for (Entry e : map.entrySet()) { sb.append(Ssortingng.format(template, e.getKey(), e.getValue())); } if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); // Ugly way to remove the last comma } return sb.toSsortingng(); 

Je sais que devoir supprimer la dernière virgule est moche, mais je pense que c’est plus propre que les alternatives comme celle de cette solution ou manuellement en utilisant un iterator.

En tant que solution rapide et sale exploitant l’infrastructure existante, vous pouvez uglyPrintedMap votre uglyPrintedMap dans un uglyPrintedMap java.util.HashMap , puis utiliser toSsortingng() .

 uglyPrintedMap.toSsortingng(); // ugly System.out.println( uglyPrintedMap ); // prints in an ugly manner new HashMap(jobDataMap).toSsortingng(); // pretty System.out.println( new HashMap(uglyPrintedMap) ); // prints in a pretty manner