HashMap
Un HashMap este o structură care stochează perechi cheie-valoare. Gândește-te la el ca la lista de contacte a lui Tommy: fiecare nume (cheia) mapează la un număr de telefon (valoarea). Cauți numele, primești numărul
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, String> contacte = new HashMap<String, String>();
contacte.put("Tommy", "555-0001");
contacte.put("Lance", "555-0002");
contacte.put("Cortez", "555-0003");
System.out.println(contacte.get("Tommy"));
System.out.println(contacte.get("Lance"));
}
}
Ieșire
555-0001
555-0002
HashMap<String, String>: primul tip este pentru chei, al doilea pentru valori. Poți amesteca: HashMap<String, Integer> are chei String și valori numerice. La fel ca la ArrayList, folosești Integer în loc de int, Double în loc de double
Principalele metode
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> scoruri = new HashMap<String, Integer>();
// put: adauga sau actualizeaza o pereche
scoruri.put("Tommy", 9500);
scoruri.put("Lance", 7200);
scoruri.put("Tommy", 10000); // actualizeaza scorul lui Tommy
// get: valoarea pentru o cheie (null daca nu exista)
System.out.println("Tommy: " + scoruri.get("Tommy"));
System.out.println("Sonny: " + scoruri.get("Sonny"));
// containsKey: verifica daca o cheie exista
System.out.println(scoruri.containsKey("Lance"));
// size: cate perechi
System.out.println("Total: " + scoruri.size());
}
}
Ieșire
Tommy: 10000
Sonny: null
true
Total: 2
put cu aceeași cheie nu adaugă un duplicat, ci actualizează valoarea existentă
Parcurgere cu keySet(): obții toate cheile și le parcurgi cu for-each
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> scoruri = new HashMap<String, Integer>();
scoruri.put("Tommy", 9500);
scoruri.put("Lance", 7200);
scoruri.put("Phil", 3100);
for (String nume : scoruri.keySet()) {
System.out.println(nume + ": " + scoruri.get(nume));
}
}
}
Output (ordinea poate varia, HashMap nu garantează ordinea)
Tommy: 9500
Phil: 3100
Lance: 7200
Citește for (String nume : scoruri.keySet()) ca: „pentru fiecare cheie din map"
Parcurgere cu entrySet(): când vrei cheia și valoarea direct, fără un apel extra la .get()
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> scoruri = new HashMap<String, Integer>();
scoruri.put("Tommy", 9500);
scoruri.put("Lance", 7200);
scoruri.put("Phil", 3100);
for (Map.Entry<String, Integer> intrare : scoruri.entrySet()) {
System.out.println(intrare.getKey() + " -> " + intrare.getValue());
}
}
}
Map.Entry<String, Integer> ține o pereche cheie-valoare. .getKey() returnează cheia, .getValue() returnează valoarea
Hai să filtrăm: Sonny Forelli vrea să afle cine îi datorează mai mult de $5000
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> datorii = new HashMap<String, Integer>();
datorii.put("Tommy", 10000);
datorii.put("Lance", 3000);
datorii.put("Phil", 7500);
datorii.put("Cortez", 500);
for (String nume : datorii.keySet()) {
if (datorii.get(nume) > 5000) {
System.out.println(nume + " datoreaza quot; + datorii.get(nume));
}
}
}
}
Afișează doar Tommy și Phil, ei datorează mai mult de $5000
HashMap nu garantează ordinea. Dacă adaugi Tommy, Lance, Phil, la parcurgere ar putea ieși în orice ordine. Nu te baza pe ordinea de inserare
Misiune: Registrul Misiunilor
Cortez ține evidența câte misiuni a completat fiecare membru al echipajului. Tommy a completat 47, Lance 12, Phil 8 și Mercedes 23. Cortez vrea un raport doar cu cei care au completat mai mult de 15 misiuni
Stochează cele patru numere de misiuni în variabilele nr1 (Tommy), nr2 (Lance), nr3 (Phil) și nr4 (Mercedes). Construiește un HashMap<String, Integer> care mapează numele fiecărui membru la numărul lui. Parcurge map-ul și afișează doar membrii al căror număr depășește 15, în formatul nume: numar
Exemplu (ordinea poate varia)
Tommy: 47
Mercedes: 23