web-dev-qa-db-fra.com

Impression de HashMap en Java

J'ai un HashMap:

private HashMap<TypeKey,TypeValue > example= new HashMap<TypeKey, TypeValue>();

Maintenant, j'aimerais parcourir toutes les valeurs et les imprimer.

J'ai écrit ceci:

for (TypeValue name: this.example.keySet()){

        System.out.println(name);
} 

Cela ne semble pas fonctionner.

Quel est le problème?

EDIT: Une autre question: cette collection est-elle basée sur zéro? Je veux dire si elle a 1 clé et la valeur sera la taille 0 ou 1?

81
Unknown user

keySet () ne renvoie qu'un ensemble de clés de votre hashmap, vous devriez itérer cet ensemble de clés et obtenir la valeur de la hashmap à l'aide de ces clés.

Dans votre exemple, le type de clé de hashmap est TypeKey, mais vous avez spécifié TypeValue dans votre boucle for générique, de sorte qu'elle ne peut pas être compilée. Vous devriez le changer pour:

for (TypeKey name: example.keySet()){

            String key =name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  


} 

Si vous n'avez pas besoin d'imprimer la valeur de clé et que vous avez simplement besoin de la valeur hashmap, vous pouvez utiliser les suggestions des autres.

Une autre question: est-ce que cette collection est zéro base? Je veux dire si elle a 1 clé et la valeur sera-t-elle de 0 ou 1?

La collection renvoyée par keySet() est un Set . Vous ne pouvez pas obtenir la valeur d'un Set à l'aide d'un index, il n'est donc pas question de savoir s'il est basé sur zéro ou sur un. Si votre hashmap a une clé, le keySet () retourné aura une entrée à l'intérieur et sa taille sera 1.

87
Ken Chan

Un moyen simple de voir les paires clé-valeur:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(Arrays.asList(map)); // method 1
System.out.println(Collections.singletonList(map)); // method 2

La méthode 1 et la méthode 2 ont toutes deux généré ceci:

[{b=2, a=1}]
65
Mingfei

En supposant que vous ayez un Map<KeyType, ValueType>, vous pouvez l’imprimer comme ceci:

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}
36
user000001

Pour imprimer la clé et la valeur, utilisez ce qui suit:

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }
13
Venkatesh

Vous avez plusieurs options

13
Bozho

Vous voulez la valeur définie, pas la clé:

for (TypeValue name: this.example.values()) {
        System.out.println(name);
}

Le code que vous avez donné ne serait même pas compilé, ce qui mérite d’être mentionné dans les questions futures - "ne semble pas fonctionner" est un peu vague!

9
davmac

Il convient de mentionner l’approche Java 8, qui utilise BiConsumer et les fonctions lambda:

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

En supposant que vous ayez remplacé la méthode toString des deux types si nécessaire.

7
Maroun

Je l'ai fait en utilisant String Map (si vous travaillez avec String Map).

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}
4
Edson Júnior

Une instruction print simple avec le nom de variable qui contient la référence de la carte de hachage ferait:

HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}

Cela fonctionne car la méthode toString() est déjà remplacée dans le AbstractMap class qui est étendu par le HashMap Class Plus d'informations dans la documentation 

Renvoie une représentation sous forme de chaîne de cette carte. La représentation sous forme de chaîne consiste en une liste de mappages clé-valeur dans l'ordre renvoyé par l'itérateur de la vue entrySet de la carte, entre accolades ("{}"). Les mappages adjacents sont séparés par les caractères "," (virgule et espace). Chaque mappage clé-valeur est rendu sous forme de clé suivie d'un signe égal ("=") suivi de la valeur associée. Les clés et les valeurs sont converties en chaînes, comme dans String.valueOf (Object).

3
arjun gulyani

Nouvelle fonctionnalité de Java 8 forEach style 

import Java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> example = new HashMap<>();
        example.put("a", 1);
        example.put("b", 2);
        example.put("c", 3);
        example.put("d", 5);

        example.forEach((key, value) -> System.out.println(key + " : " + value));

//      Output:
//      a : 1
//      b : 2
//      c : 3
//      d : 5

    }
}
2
ahmet

Pour moi, cette simple ligne fonctionnait bien:

Arrays.toString(map.entrySet().toArray())
2
KayV

Si la carte contient une collection en tant que valeur, les autres réponses nécessitent un effort supplémentaire pour les convertir en chaînes, telles que Arrays.deepToString(value.toArray()) (si c'est une carte de valeurs de liste), etc.

J'ai souvent fait face à ces problèmes et suis tombé sur la fonction générique pour imprimer tous les objets en utilisant ObjectMappers. C’est très pratique dans tous les lieux, en particulier lors de l’expérimentation, et je vous recommande de choisir de cette façon.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public static String convertObjectAsString(Object object) {
    String s = "";
    ObjectMapper om = new ObjectMapper();
    try {
        om.enable(SerializationFeature.INDENT_OUTPUT);
        s = om.writeValueAsString(object);
    } catch (Exception e) {
        log.error("error converting object to string - " + e);
    }
    return s;
}
1
Thirukka Karnan
map.forEach((key, value) -> System.out.println(key + " " + value));

Utilisation de Java 8 fonctionnalités

0
Thorgal

Utile pour imprimer rapidement des entrées dans une carte de hachage

System.out.println(Arrays.toString(map.entrySet().toArray()));
0
ThReSholD

Vous pouvez utiliser Entry class pour lire HashMap facilement.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
0
Sagar Ch