Ciao! Oggi parleremo di un'altra struttura dati: la mappa. Il suo nome ufficiale russo è “array associativo”, ma non viene utilizzato spesso. Le opzioni più comuni sono "dizionario", "mappa" o (molto spesso) l'anglicismo gergale "mappa" :) All'interno di Mappa, i dati vengono archiviati nel formato "chiave" - "valore", ovvero in coppia. Sia le chiavi che i valori possono essere qualsiasi oggetto: numeri, stringhe o oggetti di altre classi.
In che modo Map differisce dalle altre strutture dati
In precedenza, abbiamo esaminato le strutture dati in cui gli elementi sono archiviati da soli. In un array, o ArrayList / LinkedList , memorizziamo un certo numero di elementi. Ma cosa succede se il nostro compito cambia leggermente? Ad esempio, immagina di trovarci di fronte al compito di creare un elenco di 100 persone, in cui verranno archiviati il nome completo e il numero di passaporto della persona. In linea di principio, non è così difficile. Ad esempio, puoi inserirli entrambi in una riga e creare un elenco di righe come questo: "Anna Ivanovna Reshetnikova, 4211 717171". Ma questa soluzione presenta due inconvenienti. Innanzitutto, potremmo aver bisogno di una funzione di ricerca del passaporto. E con questo formato per l'archiviazione delle informazioni, ciò sarà problematico. E in secondo luogo, nulla ci impedirà di creare due persone diverse con gli stessi numeri di passaporto. E questo è lo svantaggio più grave della nostra soluzione. Tali situazioni dovrebbero essere completamente escluse; non esistono due persone con lo stesso numero di passaporto. Qui la Mappa e le sue caratteristiche dichiarate ci vengono in aiuto (memorizzazione dei dati in coppia nel formato “chiave”-”valore”). Diamo un'occhiata all'implementazione della mappa più comune: la classe Java HashMap .Creare una HashMap in Java e lavorare con la classe
Questa implementazione è molto semplice da creare:public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Qui abbiamo creato un dizionario in cui gli elementi verranno memorizzati nel formato “stringa numerica”. Il numero sarà la chiave e la stringa sarà il valore. Abbiamo anche indicato che tipo di chiavi avremo ( Integer
) e che tipo di valori ( String
). Perché è così? Innanzitutto, la chiave in una HashMap è sempre unica . Questo funzionerà benissimo per noi perché possiamo usare il numero del passaporto come chiave ed evitare duplicati. E la riga con il nome completo fungerà da valore (il nome completo di persone diverse può essere facilmente ripetuto, per noi non c'è niente di sbagliato).
Aggiunta di una nuova coppia a una HashMap
Questa attività è simile alla seguente:public class Main {
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
passportsAndNames.put(8082771, "Donald John Trump");
System.out.println(passportsAndNames);
}
}
A questo scopo viene utilizzato il metodo put()
. Inoltre, HashMap ha un metodo sovrascritto toString()
in modo che possa essere stampato sulla console. L'output sarà simile al seguente: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}
Caratteristiche delle chiavi HashMap
Ora controlliamo se le chiavi sono davvero uniche? Proviamo ad aggiungere un nuovo elemento con una chiave già esistente nella mappa:public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
passportsAndNames.put(8082771, "Donald John Trump");
passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key
System.out.println(passportsAndNames);
}
Risultato: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Viktor Mikhailovich Stychkin} L'elemento precedente con la chiave 162348, come puoi vedere, è stato sovrascritto. “La Chiave” era chiamata la chiave per un motivo. L'accesso ai valori in una HashMap avviene tramite chiave (ma non viceversa: la chiave non può essere ottenuta tramite valore, poiché i valori possono essere duplicati). Ciò è chiaramente visibile negli esempi di acquisizione di un elemento e di rimozione di un elemento da una HashMap:
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
passportsAndNames.put(8082771, "Donald John Trump");
String lidiaName = passportsAndNames.get(212133);
System.out.println(lidiaName);
passportsAndNames.remove(162348);
System.out.println(passportsAndNames);
}
Per ottenere un valore o rimuovere una coppia dal dizionario, dobbiamo passare esattamente la chiave univoca corrispondente a questo valore ai get()
metodi . Non ci sono indici numerici, come negli array o negli elenchi, in HashMap : si accede al valore tramite chiave. Uscita console: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()
Verifica della presenza di una chiave e di un valore
Nelle classi ArrayList e LinkedList , potremmo verificare se una lista contiene un particolare elemento. Anche HashMap ti consente di farlo, e per entrambe le parti della coppia: ha metodicontainsKey()
(controlla la presenza di una chiave) e containsValue()
(controlla la presenza di un valore).
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
passportsAndNames.put(8082771, "Donald John Trump");
System.out.println(passportsAndNames.containsKey(11111));
System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
Risultato: falso vero
Ottenere un elenco di tutte le chiavi e i valori
Un'altra caratteristica utile di HashMap è che puoi ottenere separatamente un elenco di tutte le chiavi e tutti i valori . Per questo, vengono utilizzati metodikeySet()
e values()
:
public class Main {
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
passportsAndNames.put(8082771, "Donald John Trump");
Set<Integer> keys = passportsAndNames.keySet();
System.out.println("Keys: " + keys);
ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
System.out.println("Values: " + values);
}
}
Le chiavi vengono estratte nella collezione Set
. La sua particolarità è che non può contenere elementi ripetitivi. Ora la cosa principale da ricordare è che l'elenco di tutte le chiavi può essere estratto da HashMap in una raccolta separata. Nell'esempio, abbiamo salvato i valori su normal ArrayList
. Output della console: Chiavi: [212133, 8082771, 162348] Valori: [Lidiya Arkadyevna Bublikova, Donald John Trump, Ivan Mikhailovich Serebryakov] I metodi size()
fanno clear()
esattamente la stessa cosa delle strutture precedenti che abbiamo esaminato: il primo restituisce un numero di elementi nel dizionario in questo momento, il secondo cancella tutti gli elementi.
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
passportsAndNames.put(8082771, "Donald John Trump");
System.out.println(passportsAndNames.size());
passportsAndNames.clear();
System.out.println(passportsAndNames);
}
Output: 3 {} Per verificare se la nostra HashMap ha almeno un elemento, possiamo utilizzare il metodo isEmpty()
:
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
passportsAndNames.put(8082771, "Donald John Trump");
if (!passportsAndNames.isEmpty()) {
System.out.println(passportsAndNames);
}
}
Output: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov} Ora eseguiremo l'output sulla console solo dopo la verifica preliminare :)
Combinando due mappe in una
Un altro punto interessante è che due mappe possono essere combinate in una sola . C'è un metodo per questoputAll()
. Lo chiamiamo sulla prima HashMap , passiamo la seconda come argomento e gli elementi della seconda verranno aggiunti al primo:
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
HashMap<Integer, String> passportsAndNames2 = new HashMap<>();
passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
passportsAndNames.put(8082771, "Donald John Trump");
passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");
passportsAndNames.putAll(passportsAndNames2);
System.out.println(passportsAndNames);
}
Output: {917352=Alexey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 925648=Maxim Olegovich Arkharov, 162348=Ivan Mikhailovich Serebryakov} Tutti gli elementi di PassportsAndNames2 sono stati copiati in PassportsAndNames . Ora diamo un'occhiata a un esempio più complicato. Vale a dire, scorrere HashMap in un ciclo.
for (Map.Entry entry: passportsAndNames.entrySet()) {
System.out.println(entry);
}
Un'interfaccia Map.Entry
significa semplicemente una coppia chiave-valore all'interno di un dizionario. Il metodo entrySet()
restituisce un elenco di tutte le coppie nella nostra HashMap (poiché la nostra mappa è costituita proprio da tali coppie di voci, iteriamo sulle coppie e non su chiavi o valori separatamente). Conclusione: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov Salva questo articolo per il futuro: https://habr.com/ru/post/128017/ Ora è troppo presto per leggerlo, ma in futuro , quando metterai le mani su HashMap, ti aiuterà a capire come funziona questa struttura di dati dall'interno. Inoltre, non dimenticare di consultare la documentazione ufficiale Oracle su HashMap.
GO TO FULL VERSION