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?
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.
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}]
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());
}
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));
}
Vous avez plusieurs options
map.values()
, qui obtient les valeurs, pas les clésmap.entrySet()
qui a les deuxkeySet()
et pour chaque appel de touche map.get(key)
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!
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.
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());
}
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).
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
}
}
Pour moi, cette simple ligne fonctionnait bien:
Arrays.toString(map.entrySet().toArray())
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;
}
map.forEach((key, value) -> System.out.println(key + " " + value));
Utilisation de Java 8 fonctionnalités
Utile pour imprimer rapidement des entrées dans une carte de hachage
System.out.println(Arrays.toString(map.entrySet().toArray()));
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
}