Je recherche une manière agréable d'imprimer un fichier Map
.
map.toString()
Donne moi: {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 comme ceci: key1="value1", key2="value2", key3="value3"
J'ai écrit ce petit bout de code:
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();
Mais je suis sûr qu'il existe une manière plus élégante et concise de le faire.
java
dictionary
pretty-print
space_monkey
la source
la source
System.out.println
sont trop proches. Et si vous voulez quelque chose de personnalisé, cela se résume à "comment itérer sur une carte en Java" qui a certainement beaucoup d'autres réponses.Réponses:
Ou mettez votre logique dans une petite classe bien rangée.
Usage:
Remarque: vous pouvez également mettre cette logique dans une méthode utilitaire.
la source
la source
Map<String, Map<String,double[]>>
, alors vous aurez ce type de piqûre:[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
Jetez un œil à la bibliothèque Guava:
la source
Les bibliothèques Apache à la rescousse!
Tout ce dont vous avez besoin bibliothèque Apache commons-collections ( lien du projet )
Les utilisateurs Maven peuvent ajouter la bibliothèque en utilisant cette dépendance:
la source
Map<String, String[]>
). Seuls leur nom de classe et leur hachage sont imprimés à la place des valeurs réelles.Simple et facile. Bienvenue dans le monde JSON. Utilisation du Gson de Google :
Exemple de carte avec 3 touches:
la source
Quand j'ai
org.json.JSONObject
dans le classpath, je fais:(cela indente magnifiquement les listes, les ensembles et les cartes qui peuvent être imbriqués)
la source
Utilisation de Java 8 Streams:
la source
,
Je préfère convertir la carte en une chaîne JSON c'est:
prend en charge les types complexes imbriqués dans l'objet
la source
Regardez le code pour
HashMap#toString()
etAbstractMap#toString()
dans les sources OpenJDK:Donc, si les gars d'OpenJDK n'ont pas trouvé de moyen plus élégant de le faire, il n'y en a pas :-)
la source
Vous devriez pouvoir faire ce que vous voulez en faisant:
System.out.println(map)
par exempleTant que TOUS vos objets de la carte ont overiden la
toString
méthode que vous verriez :{key1=value1, key2=value2}
d'une manière significativeSi c'est pour votre code, alors le dépassement
toString
est une bonne habitude et je vous suggère de plutôt opter pour cela.Pour votre exemple où sont vos objets,
String
vous devriez aller bien sans rien d'autre.Ie
System.out.println(map)
imprimerait exactement ce dont vous avez besoin sans aucun code supplémentairela source
java.util.Map
n'a pas de contrat concernanttoString()
, donc c'est à laMap
mise en œuvre réelle ce queSystem.out.println(map)
->PrintStream.println(map)
->String.valueOf(map)
->map.toString()
provoquera. Il arrive que le souvent utiliséjava.util.AbstractMap
fournit une belle représentation sous forme de chaîne pourtoString()
. ... D'autresMap
implémentations peuvent se rabattre surObject.toString()
, ce qui se traduit par le moins informatifcom.example.MyMap@4e8c0de
.la source
Je suppose que quelque chose comme celui-ci serait plus propre et vous offrirait plus de flexibilité avec le format de sortie (changez simplement le modèle):
Je sais que devoir supprimer la dernière virgule est moche, mais je pense que c'est plus propre que des alternatives comme celle de cette solution ou manuellement en utilisant un itérateur.
la source
En tant que solution rapide et sale tirant parti de l'infrastructure existante, vous pouvez envelopper votre
uglyPrintedMap
dans unjava.util.HashMap
, puis l'utilisertoString()
.la source
Ne répond pas exactement à la question, mais il convient de mentionner l'
@ToString
annotation Lombodok . Si vous annotez avec@ToString
leskey / value
classes, alors faireSystem.out.println(map)
retournera quelque chose de significatif.Cela fonctionne également très bien avec les cartes-de-cartes, par exemple:
Map<MyKeyClass, Map<String, MyValueClass>>
sera imprimé comme{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }
la source
String result = objectMapper.writeValueAsString(map)
- aussi simple que ça!Résultat:
PS ajoutez Jackson JSON à votre chemin de classe.
la source
Depuis java 8, il existe un moyen simple de le faire avec Lambda:
la source