CodeGym /Blog Java /Aleatoriu /HashMap: ce fel de hartă este aceasta?
John Squirrels
Nivel
San Francisco

HashMap: ce fel de hartă este aceasta?

Publicat în grup
Bună! În această lecție, vom analiza mai detaliat Java HashMap . Anterior, am studiat structurile de date în care elementele sunt stocate ca ele însele. Într-o matrice sau într-un ArrayList / LinkedList , stocăm un număr de elemente. Dar dacă sarcina noastră se schimbă puțin?
HashMap: ce fel de hartă este aceasta?  - 1
Imaginați-vă următoarea sarcină: creați o listă de 100 de persoane care stochează numele și numărul pașaportului fiecărei persoane. În principiu, acest lucru nu este atât de dificil. De exemplu, le puteți introduce pe ambele într-un șir, apoi puteți crea o listă cu aceste șiruri: „Amelia Aguilar, 4211 717171”. Dar această soluție are două dezavantaje. În primul rând, este posibil să avem nevoie de capacitatea de a căuta după numărul de pașaport. Și acest lucru va fi problematic având în vedere acest format de stocare a informațiilor. În al doilea rând, nimic nu ne împiedică să creăm două persoane diferite cu același număr de pașaport. Și acesta este cel mai grav deficiență al soluției noastre. Acest lucru nu ar trebui să fie permis niciodată: nu există două persoane să aibă același număr de pașaport. O nouă structură de date ne vine în ajutor: Harta. Este cunoscut și ca „matrice asociativă”, dar acest termen este folosit rar. Mai frecvent, se numește „dicționar” sau „hartă”. :) Cum este fundamental diferit de structurile de date pe care le-am luat în considerare anterior? Mai presus de toate, în faptul că datele dintr-o hartă sunt stocate ca perechi cheie-valoare. Orice poate servi drept chei și valori: numere, șiruri de caractere sau obiecte din alte clase. Astăzi vom studia cea mai comună implementare a clasei Map : Java HashMap . HashMap: ce fel de hartă este aceasta?  - 2

Deci, ce trebuie să știm despre HashMap în Java?

Este foarte ușor de creat:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Aici creăm un dicționar care stochează elemente ca perechi „număr-șir”. Numărul va acționa ca cheie, iar șirul ca valoare. De asemenea, specificam tipul cheii (Integer) si tipul valorii (String). De ce? În primul rând, o cheie HashMap este întotdeauna unică. Acest lucru ni se potrivește perfect, deoarece putem folosi numărul pașaportului ca cheie și evităm duplicatele. Valoarea va fi un șir cu numele complet (persoane diferite pot avea același nume; nu este nimic de care să ne facem griji). Adăugarea unei noi perechi la HashMap arată astfel:

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
Folosim metoda put() pentru aceasta. În plus, HashMap suprascrie metoda toString() , astfel încât să poată fi afișată pe consolă. Rezultatul va arăta astfel: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan cel Mare} Acum să verificăm dacă cheile sunt cu adevărat unice? Să încercăm să adăugăm un nou element cu o cheie care a fost deja folosită pe hartă:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
Ieșire: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} După cum puteți vedea, valoarea anterioară asociată cu cheia 162348 a fost suprascrisă. Folosim termenul „cheie” cu un motiv. Valorile dintr-un HashMap sunt accesate folosind cheia, dar nu invers. Cheia nu poate fi obținută folosind o valoare, deoarece este posibil ca valorile să nu fie unice. Acest lucru poate fi văzut clar când obțineți sau eliminați un element din HashMap :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
Pentru a obține o valoare sau a elimina o pereche din dicționar, trebuie să trecem la get() și remove() cheia unică care corespunde valorii. Spre deosebire de matrice și liste, un HashMap în Java nu are indici numerici: valorile sunt accesate folosind cheia. Ieșire din consolă: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} Clasele ArrayList și LinkedList ne permit să verificăm dacă lista conține vreun element anume. Java HashMap ne permite să facem acest lucru. În plus, putem face acest lucru pentru ambii membri ai perechii: Iată ce conțineKey () (verifică o cheie) și containsValue()(verifică pentru o valoare) metodele sunt pentru.

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
Ieșire: fals adevărat O altă caracteristică convenabilă a HashMap în Java este faptul că puteți obține liste separate cu toate cheile și toate valorile. Acest lucru se realizează cu metodele keySet() și values() :

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
Cheile sunt extrase într-un set , pe care nu l-am acoperit încă. Este special prin faptul că nu poate conține elemente repetate. Acum, principalul lucru este să ne amintim că lista tuturor cheilor poate fi preluată dintr-un HashMap într-o colecție separată. În exemplu, am salvat valorile într-o ArrayList obișnuită . Ieșire din consolă: Chei: [212133, 8082771, 162348] Valori: [Bridget Logan, Donald John Trump, Ivan the Great] Metodele size () și clear() fac exact același lucru ca în structurile anterioare despre care am discutat: primul returnează numărul de elemente aflat în prezent în dicționar, al doilea elimină toate elementele.

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);
}
Ieșire: 3 {} Pentru a verifica dacă există cel puțin un element în HashMap , putem folosi metoda isEmpty() :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
Ieșire: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan cel Mare} Acum vom ieși pe consolă doar după o verificare preliminară. :) Un alt punct interesant este că două hărți pot fi combinate într-una singură. Acest lucru a fost realizat folosind metoda putAll() . Îl numim pe primul HashMap , îl trecem pe al doilea ca argument, iar elementele din al doilea sunt adăugate primului:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
Ieșire: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan cel Mare} Toate perechile din pasaportsAndNames2 au fost copiate în pasaportsAndNames . Acum luați în considerare un exemplu mai complicat. Mai exact, repetarea peste un HashMap într-o buclă.

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Clasa Map.Entry denotă perechea cheie-valoare din dicționar. Metoda entrySet () returnează o listă cu toate perechile din HashMap . Deoarece harta noastră constă din aceste perechi Map.Entry , repetăm ​​peste perechi, nu chei sau valori separate. Ieșire: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan cel Mare De asemenea, nu uitați să studiați documentația oficială Oracle pentru HashMap .
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION