1. Un ensemble de paires clé-valeur.
En Java, une autre collection intéressante (au sens large) est Map
. Parfois, cette structure de données est également appelée dictionnaire.
Il est similaire à la Set
collection, mais il stocke un ensemble de "paires" d'éléments plutôt qu'un ensemble d'éléments. Chaque paire dans a se Map
compose de deux éléments : une "clé" et une "valeur".
Supposons que vous souhaitiez que votre programme stocke les noms des employés et leurs salaires, ou les noms de vos collègues et leur âge. Ensuite, vous auriez besoin d'un tableau comme celui-ci:
Nom | Âge |
---|---|
Élon | 21 |
Jef | 22 |
Facture | 48 |
Garenne | ? |
Chaque ligne contient quelques valeurs. Nous appellerons le nom la clé de la paire et l'âge la valeur de la paire .
L'ensemble de ces paires est notre carte ( Map
).
La clé d'une paire peut être n'importe quoi sauf null
. Les clés doivent être uniques : une carte ne peut pas contenir deux clés identiques.
2. HashMap
classe
La HashMap
classe est le type de collection le plus populaire Map
. D'une part, il est très similaire à HashSet et possède toutes ses méthodes. D'un autre côté, c'est comme une liste ( ArrayList
) qui peut utiliser des mots (ou n'importe quoi d'autre) comme indices.
Vous pouvez créer un HashMap
en utilisant une déclaration comme celle-ci :
HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();
Où KeyType
est le type des clés dans les paires stockées et ValueType
est le type des valeurs dans les paires stockées dans la HashMap
collection.
La HashMap
classe a des méthodes comme celle-ci :
Méthode | Description |
---|---|
|
Ajoute la paire ( key , value ) à la collection |
|
Renvoie la valeur associée à une clé. |
|
Vérifie si une clé existe dans la collection |
|
Vérifie l'existence d'une valeur dans la collection |
|
Supprime un élément de la collection |
|
Efface la collection en supprimant tous les éléments |
|
Renvoie le nombre de paires clé-valeur dans la collection |
|
Renvoie le jeu de clés de la collection |
|
Renvoie un ensemble contenant les éléments de la collection |
|
Renvoie un ensemble ( Set ) de toutes les paires ( Map.Entry ) de la collection. |
Ajouter des éléments à unHashMap
Les éléments sont ajoutés à une carte par paires à l'aide de la put()
méthode. La clé est passée en premier argument et la valeur est passée en second.
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);
Lors de l'ajout d'une paire clé-valeur, si la clé existe déjà dans la collection, l'ancienne valeur est remplacée par la nouvelle valeur.
Ce comportement fait de HashMap
a un tableau ou une liste dont les indices sont des mots ( String
) au lieu de nombres.
Presque tous les types peuvent être KeyType ou ValueType. Il existe quelques petites exigences supplémentaires pour le KeyType, et vous en apprendrez davantage lorsque vous étudierez les collections plus en détail dans la quête Java Collections.
3. Sous-ensembles de a HashMap
: le jeu de clés
Disons que nous voulons simplement afficher toutes les entrées dans un HashMap
sur l'écran. Comment faisons-nous cela? Pour ce faire, nous devons savoir comment parcourir toutes les entrées du fichier HashMap
. Cela peut se faire de plusieurs manières.
Le moyen le plus simple consiste à boucler sur les touches
HashMap
les entrées ne sont pas numérotées séquentiellement, donc une boucle avec un compteur ne fonctionnera pas ici. Mais nous pouvons obtenir un ensemble de clés en utilisant la keySet()
méthode, et vous savez déjà comment itérer sur un ensemble :
Code | Description |
---|---|
|
Boucle sur les clés de la map Obtenir la valeur associée à la clé |
La keySet()
méthode renvoie un ensemble de clés. Vous pouvez utiliser cet ensemble de deux façons :
Notation compacte | Notation longue |
---|---|
|
|
4. Boucler sur des paires clé-valeur
Il existe également une méthode plus compliquée : vous pouvez transformer a Map
en un ensemble de paires clé-valeur , puis boucler sur les éléments de l'ensemble, comme nous l'avons déjà appris.
La HashMap
collection a une classe d'assistance qui stocke une paire clé-valeur. Il ressemble approximativement à ceci :
class Entry<KeyType, ValueType>
{
private KeyType key;
private ValueType value;
public KeyType getKey()
{
return this.key;
}
public ValueType getValue()
{
return this.value;
}
}
Le résultat de l'appel de la entrySet()
méthode sur un objet sera un :HashMap<KeyType, ValueType>
Set<Entry<KeyType, ValueType>>
Set<Entry<KeyType, ValueType>> name = map.entrySet();
Ici, nous avons la Set
classe générique avec un paramètre de type, qui à son tour est un type générique ( Entry
) avec deux paramètres de type.
Il est très facile pour un débutant de s'embrouiller à ce sujet. Mais une fois que vous avez compris, vous pouvez écrire du code comme :
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Cela dit, ce code peut être un peu simplifié :
Tout d'abord, vous pouvez ignorer la création d'une variable distincte pour entries
et appeler à la place la entrySet()
méthode directement dans la for
boucle :
for(Map.Entry<String, Integer> pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Deuxièmement, vous pouvez utiliser l'opérateur récemment introduit var
pour déduire automatiquement le type de la paire clé-valeur :
for(var pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Pas mal, hein ?
5. Comparaison de ArrayList
etHashMap
A HashMap
ressemble fortement à an ArrayList
qui permet d'utiliser des chaînes (ou d'autres types) comme index (les clés).
Si vous utilisez Integer
pour les clés dans un HashMap
, cela devient encore plus similaire à un ArrayList
. Comparons:
Coder avec ArrayList<String> | Code avec HashMap<Integer, String> |
---|---|
|
|