1. Un set de perechi cheie-valoare.
În Java, o altă colecție interesantă (în linii mari) este Map
. Uneori, această structură de date este numită și dicționar.
Este similar cu Set
colecția, dar stochează un set de „perechi” de elemente, mai degrabă decât un set de elemente. Fiecare pereche dintr-o Map
constă din două elemente: o „cheie” și o „valoare”.
Să presupunem că doriți ca programul dvs. să stocheze numele angajaților și salariile acestora sau numele colegilor și vârstele acestora. Atunci ai nevoie de un tabel ca acesta:
Nume | Vârstă |
---|---|
Elon | 21 |
Jeff | 22 |
Factură | 48 |
Warren | ? |
Fiecare rând conține câteva valori. Ne vom referi la nume ca fiind cheia perechii , iar vârsta ca valoare a perechii .
Întregul set al acestor perechi este harta noastră ( Map
).
Cheia unei perechi poate fi orice, cu excepția null
. Cheile trebuie să fie unice: o hartă nu poate conține două chei identice.
2. HashMap
clasa
Clasa HashMap
este cel mai popular tip de Map
colecție. Pe de o parte, este foarte asemănător cu HashSet și are toate metodele sale. Pe de altă parte, este ca o listă ( ArrayList
) care poate folosi cuvinte (sau orice altceva) ca indici.
Puteți crea o HashMap
declarație folosind o declarație ca aceasta:
HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();
Unde KeyType
este tipul cheilor din perechile stocate și ValueType
este tipul valorilor din perechile stocate în HashMap
colecție.
Clasa HashMap
are metode ca aceasta:
Metodă | Descriere |
---|---|
|
Adaugă perechea ( key , value ) la colecție |
|
Returnează valoarea asociată cu o cheie. |
|
Verifică dacă o cheie există în colecție |
|
Verifică existența unei valori în colecție |
|
Elimină un element din colecție |
|
Șterge colecția, eliminând toate elementele |
|
Returnează numărul de perechi cheie-valoare din colecție |
|
Returnează setul de chei din colecție |
|
Returnează un set care conține elementele colecției |
|
Returnează un set ( Set ) de toate perechile ( Map.Entry ) din colecție. |
Adăugarea de elemente la aHashMap
Elementele sunt adăugate la o hartă ca perechi folosind put()
metoda. Cheia este transmisă ca prim argument, iar valoarea este transmisă ca al doilea.
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);
Când adăugați o pereche cheie-valoare, dacă cheia există deja în colecție, atunci valoarea veche este înlocuită cu noua valoare.
Acest comportament face HashMap
ca o matrice sau o listă ai cărei indici sunt cuvinte ( String
) în loc de numere.
Aproape orice tip poate fi KeyType sau ValueType. Există câteva mici cerințe suplimentare pentru KeyType și veți afla despre ele când studiați colecțiile mai detaliat în misiunea Java Collections.
3. Subseturile lui a HashMap
: setul de chei
Să presupunem că vrem doar să afișăm toate intrările într-o HashMap
pe ecran. Cum facem asta? Pentru a face acest lucru, trebuie să știm cum să parcurgem toate intrările din HashMap
. Acest lucru se poate face în mai multe moduri.
Cel mai simplu mod este să treceți peste taste
HashMap
intrările nu sunt numerotate secvenţial, deci o buclă cu un contor nu va funcţiona aici. Dar putem obține un set de chei folosind keySet()
metoda și știți deja cum să repetați un set:
Cod | Descriere |
---|---|
|
Buclă peste cheile de la map Obține valoarea asociată cheii |
Metoda keySet()
returnează un set de chei. Puteți utiliza acest set în două moduri:
Notație compactă | Notație lungă |
---|---|
|
|
4. Buclă peste perechi cheie-valoare
Există, de asemenea, o modalitate mai complicată: puteți transforma a Map
într-un set de perechi cheie-valoare și apoi treceți în buclă peste elementele setului, așa cum am aflat deja.
Colecția HashMap
are o clasă de ajutor care stochează o pereche cheie-valoare. Arata cam asa:
class Entry<KeyType, ValueType>
{
private KeyType key;
private ValueType value;
public KeyType getKey()
{
return this.key;
}
public ValueType getValue()
{
return this.value;
}
}
Rezultatul apelării entrySet()
metodei pe un obiect va fi :HashMap<KeyType, ValueType>
Set<Entry<KeyType, ValueType>>
Set<Entry<KeyType, ValueType>> name = map.entrySet();
Aici avem Set
clasa generică cu un parametru de tip, care la rândul său este un tip generic ( Entry
) cu doi parametri de tip.
Este foarte ușor pentru un începător să se încurce în această privință. Dar odată ce îți dai seama, poți scrie cod ca:
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);
}
Acestea fiind spuse, acest cod poate fi puțin simplificat:
În primul rând, puteți sări peste crearea unei variabile separate entries
și, în schimb, puteți apela entrySet()
metoda direct în for
bucla:
for(Map.Entry<String, Integer> pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
În al doilea rând, puteți utiliza var
operatorul recent introdus pentru a deduce automat tipul perechii cheie-valoare :
for(var pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Nu-i rău, nu?
5. Comparația ArrayList
șiHashMap
A HashMap
seamănă foarte mult cu un ArrayList
care permite ca șirurile de caractere (sau alte tipuri) să fie folosite ca indici (cheile).
Dacă utilizați Integer
pentru cheile într-un HashMap
, atunci devine și mai asemănător cu un ArrayList
. Să comparăm:
Codați cu ArrayList<String> | Codați cu HashMap<Integer, String> |
---|---|
|
|