CodeGym /Java-blogg /Tilfeldig /HashMap: hva slags kart er dette?
John Squirrels
Nivå
San Francisco

HashMap: hva slags kart er dette?

Publisert i gruppen
Hei! I denne leksjonen tar vi en nærmere gjennomgang på Java HashMap . Tidligere har vi studert datastrukturer der elementene er lagret som seg selv. I en matrise eller en ArrayList / LinkedList lagrer vi et visst antall elementer. Men hva om oppgaven vår endrer seg litt?
HashMap: hva slags kart er dette?  - 1
Tenk deg følgende oppgave: lag en liste med 100 personer som lagrer hver persons navn og passnummer. I prinsippet er ikke dette så vanskelig. For eksempel kan du fylle begge i en streng, og deretter lage en liste over disse strengene: "Amelia Aguilar, 4211 717171". Men denne løsningen har to ulemper. Først kan vi trenge muligheten til å søke etter passnummer. Og dette vil være problematisk gitt dette informasjonslagringsformatet. For det andre er det ingenting som hindrer oss i å opprette to forskjellige personer med samme passnummer. Og dette er vår løsnings mest alvorlige mangel. Dette bør aldri tillates: ingen personer har samme passnummer. En ny datastruktur kommer oss til hjelp: Kart. Det er også kjent som en "assosiativ array", men dette begrepet brukes sjelden. Mer vanlig kalles det en "ordbok" eller "kart". :) Hvordan er det fundamentalt annerledes enn datastrukturene vi har vurdert tidligere? Fremfor alt i det faktum at data i et kart lagres som nøkkelverdi-par. Alt kan tjene som nøkler og verdier: tall, strenger eller objekter i andre klasser. I dag skal vi studere den vanligste implementeringen av Map- klassen: Java HashMap . HashMap: hva slags kart er dette?  - 2

Så hva trenger vi å vite om HashMap i Java?

Det er veldig enkelt å lage:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Her lager vi en ordbok som lagrer elementer som "tallstreng"-par. Tallet vil fungere som nøkkelen, og strengen som verdien. Vi spesifiserer også nøkkeltypen (heltall) og verditypen (streng). Hvorfor? For det første er en HashMap- nøkkel alltid unik. Dette passer oss perfekt, siden vi kan bruke passnummeret som nøkkel og unngå duplikater. Verdien vil være en streng med det fulle navnet (forskjellige personer kan ha samme navn; det er ingenting for oss å bekymre oss for). Å legge til et nytt par til HashMap ser slik ut:

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);
   }
}
Vi bruker metoden put() for dette. I tillegg overstyrer HashMap toString() -metoden, slik at den kan vises på konsollen. Utdataene vil se slik ut: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan den store} La oss nå bekrefte om nøklene virkelig er unike? La oss prøve å legge til et nytt element med en nøkkel som allerede er brukt i kartet:

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);
}
Utdata: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} Som du kan se, ble den forrige verdien knyttet til nøkkelen 162348 overskrevet. Vi bruker begrepet "nøkkel" av en grunn. Verdier i et HashMap åpnes ved å bruke nøkkelen, men ikke omvendt. Nøkkelen kan ikke oppnås med en verdi, siden verdiene kanskje ikke er unike. Dette kan tydelig sees når du henter eller fjerner et element fra 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);
}
For å få en verdi eller fjerne et par fra ordboken, må vi gå til get() og fjerne() den unike nøkkelen som tilsvarer verdien. I motsetning til matriser og lister, har en HashMap i Java ingen numeriske indekser: verdier er tilgjengelige ved å bruke nøkkelen. Konsollutgang: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} ArrayList og LinkedList - klassene lar oss sjekke om listen inneholder et bestemt element. Java HashMap lar oss gjøre dette. Dessuten kan vi gjøre dette for begge medlemmene av paret: Dette er hva containsKey () (sjekker etter en nøkkel) og containsValue()(sjekker for en verdi) metoder er for.

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"));
}
Output: false true En annen praktisk funksjon i HashMap i Java er det faktum at du kan få separate lister over alle nøklene og alle verdiene. Dette oppnås med metodene keySet() og 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);
   }
}
Nøklene er trukket ut i et sett , som vi ikke har dekket ennå. Den er spesiell ved at den ikke kan inneholde gjentatte elementer. Nå er det viktigste å huske at listen over alle nøkler kan hentes fra et HashMap til en egen samling. I eksemplet lagret vi verdiene i en vanlig ArrayList . Konsollutgang: Taster: [212133, 8082771, 162348] Verdier: [Bridget Logan, Donald John Trump, Ivan den store] Størrelse () og clear()- metodene gjør nøyaktig det samme som i de tidligere strukturene vi har diskutert: den første returnerer antall elementer i ordboken, den andre fjerner alle elementene.

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);
}
Utdata: 3 {} For å sjekke om det er minst ett element i HashMap , kan vi bruke isEmpty() -metoden:

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);
   }
}
Utdata: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan den store} Nå vil vi bare sende ut til konsollen etter en foreløpig sjekk. :) Et annet interessant poeng er at to kart kan kombineres til ett. Dette oppnås ved å bruke putAll()- metoden. Vi kaller det på det første HashMap , sender det andre som et argument, og elementene fra det andre legges til det første:

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);
}
Utdata: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan den store} Alle parene i passAndNames2 har blitt kopiert til passportsAndNames . Vurder nå et mer komplisert eksempel. Nærmere bestemt, iterasjon over et HashMap i en loop.

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Map.Entry - klassen angir nøkkelverdi-paret inne i ordboken. EntrySet () -metoden returnerer en liste over alle parene i vår HashMap . Fordi kartet vårt består av disse Map.Entry- parene, itererer vi over par, ikke separate nøkler eller verdier. Utdata: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan den store Ikke glem å studere den offisielle Oracle- dokumentasjonen for HashMap .
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION