1. Un insieme di coppie chiave-valore.
In Java, un'altra raccolta interessante (in senso lato) è Map
. A volte questa struttura dati è anche chiamata dizionario.
È simile alla Set
raccolta, ma memorizza un insieme di "coppie" di elementi piuttosto che un insieme di elementi. Ciascuna coppia in a Map
consiste di due elementi: una "chiave" e un "valore".
Supponiamo che tu voglia che il tuo programma memorizzi i nomi dei dipendenti e i loro stipendi, o i nomi dei tuoi colleghi e la loro età. Quindi avresti bisogno di una tabella come questa:
Nome | Età |
---|---|
Elón | 21 |
Jeff | 22 |
Conto | 48 |
Warren | ? |
Ogni riga contiene un paio di valori. Faremo riferimento al nome come chiave della coppia e all'età come valore della coppia .
L'intero insieme di queste coppie è la nostra mappa ( Map
).
La chiave di una coppia può essere qualsiasi cosa tranne null
. Le chiavi devono essere univoche: una mappa non può contenere due chiavi identiche.
2. HashMap
classe
La HashMap
classe è il tipo di Map
raccolta più popolare. Da un lato, è molto simile a HashSet e ha tutti i suoi metodi. D'altra parte, è come una lista ( ArrayList
) che può usare parole (o qualsiasi altra cosa) come indici.
È possibile creare un HashMap
utilizzando una dichiarazione come questa:
HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();
Dove KeyType
è il tipo delle chiavi nelle coppie archiviate ed ValueType
è il tipo dei valori nelle coppie archiviate nella HashMap
raccolta.
La HashMap
classe ha metodi come questo:
Metodo | Descrizione |
---|---|
|
Aggiunge la coppia ( key , value ) alla raccolta |
|
Restituisce il valore associato a una chiave. |
|
Controlla se esiste una chiave nella raccolta |
|
Verifica l'esistenza di un valore nella raccolta |
|
Rimuove un elemento dalla raccolta |
|
Cancella la raccolta, rimuovendo tutti gli elementi |
|
Restituisce il numero di coppie chiave-valore nella raccolta |
|
Restituisce il set di chiavi nella raccolta |
|
Restituisce un set contenente gli elementi della raccolta |
|
Restituisce un set ( Set ) di tutte le coppie ( Map.Entry ) nella raccolta. |
Aggiunta di elementi aHashMap
Gli elementi vengono aggiunti a una mappa come coppie utilizzando il put()
metodo. La chiave viene passata come primo argomento e il valore viene passato come secondo.
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);
Quando si aggiunge una coppia chiave-valore, se la chiave esiste già nella raccolta, il vecchio valore viene sostituito dal nuovo valore.
Questo comportamento rende HashMap
simile un array o un elenco i cui indici sono parole ( String
) anziché numeri.
Quasi tutti i tipi possono essere KeyType o ValueType. Ci sono alcuni piccoli requisiti aggiuntivi per il KeyType, e imparerai a conoscerli quando studierai le collezioni in modo più dettagliato nella ricerca Java Collections.
3. Sottoinsiemi di a HashMap
: il set di chiavi
Diciamo che vogliamo solo visualizzare tutte le voci in a HashMap
sullo schermo. Come facciamo questo? Per fare ciò, dobbiamo sapere come esaminare tutte le voci nel file HashMap
. Questo può essere fatto in diversi modi.
Il modo più semplice è passare in rassegna i tasti
HashMap
le voci non sono numerate in sequenza, quindi un ciclo con un contatore non funzionerà qui. Ma possiamo ottenere un set di chiavi usando il keySet()
metodo e sai già come iterare su un set:
Codice | Descrizione |
---|---|
|
Passa sopra le chiavi di map Ottieni il valore associato alla chiave |
Il keySet()
metodo restituisce un set di chiavi. Puoi utilizzare questo set in due modi:
Notazione compatta | Notazione lunga |
---|---|
|
|
4. Loop su coppie chiave-valore
C'è anche un modo più complicato: puoi trasformare a Map
in un insieme di coppie chiave-valore e poi scorrere gli elementi dell'insieme, come abbiamo già imparato.
La HashMap
raccolta ha una classe helper che archivia una coppia chiave-valore. Sembra approssimativamente così:
class Entry<KeyType, ValueType>
{
private KeyType key;
private ValueType value;
public KeyType getKey()
{
return this.key;
}
public ValueType getValue()
{
return this.value;
}
}
Il risultato della chiamata al entrySet()
metodo su un oggetto sarà un :HashMap<KeyType, ValueType>
Set<Entry<KeyType, ValueType>>
Set<Entry<KeyType, ValueType>> name = map.entrySet();
Qui abbiamo la Set
classe generica con un parametro di tipo, che a sua volta è un tipo generico ( Entry
) con due parametri di tipo.
È molto facile per un principiante confondersi su questo. Ma una volta capito, puoi scrivere codice come:
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);
}
Detto questo, questo codice può essere un po' semplificato:
Innanzitutto, puoi saltare la creazione di una variabile separata per entries
e invece chiamare il entrySet()
metodo direttamente all'interno del for
ciclo:
for(Map.Entry<String, Integer> pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
In secondo luogo, è possibile utilizzare l' var
operatore introdotto di recente per dedurre automaticamente il tipo della coppia chiave-valore :
for(var pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Non male, eh?
5. Confronto di ArrayList
eHashMap
A HashMap
somiglia molto a an ArrayList
che consente di utilizzare stringhe (o altri tipi) come indici (le chiavi).
Se usi Integer
per le chiavi in a HashMap
, diventa ancora più simile a un ArrayList
. Confrontiamo:
Codice con ArrayList<String> | Codice con HashMap<Integer, String> |
---|---|
|
|
GO TO FULL VERSION